小编ein*_*ica的帖子

为什么我的类不可默认构造?

我有这些课程:

#include <type_traits>

template <typename T>
class A {
public:
    static_assert(std::is_default_constructible_v<T>);

};

struct B {
   struct C {
      int i = 0;
   };

    A<C> a_m;
};

int main() {
    A<B::C> a;
}
Run Code Online (Sandbox Code Playgroud)

编译时,a_m不是默认可构造的,而是a可构造的。

更改C为:

struct C {
      int i;
   };
Run Code Online (Sandbox Code Playgroud)

一切安好。

使用 Clang 9.0.0 测试。

c++ nsdmi

29
推荐指数
1
解决办法
960
查看次数

编程语言在什么情况下真正使用Infinity值?

所以在Ruby中有一个指定无穷大的技巧:

1.0/0
=> Infinity
Run Code Online (Sandbox Code Playgroud)

我相信Python你可以做这样的事情

float('inf')
Run Code Online (Sandbox Code Playgroud)

这些仅仅是一些例子,我确信大多数语言在某种程度上都具有无限性.你什么时候才能在现实世界中使用这个结构?为什么在一个范围内使用它比仅使用布尔表达式更好?例如

(0..1.0/0).include?(number) == (number >= 0) # True for all values of number
=> true
Run Code Online (Sandbox Code Playgroud)

总而言之,我正在寻找的是使用Infinity的现实世界的理由.

编辑:我正在寻找真实世界的代码.当人们真正使用它时,这就是你可以"使用它"的全部和好处.

ruby python language-agnostic idioms infinity

28
推荐指数
9
解决办法
3万
查看次数

C++ 11是否具有动态分配数组的包装器,如Boost的scoped_array?

我经常需要在C++中处理动态分配的数组,因此依赖于Boost for scoped_array,shared_array等.在阅读了Stroustrup的C++ 11 FAQC++ 11 Reference Wiki之后,我无法找到C++ 11标准提供的这些动态数组包装器的合适替代品.有什么东西我忽略了,还是我必须继续依赖Boost?

非常感谢您的帮助!

boost memory-management smart-pointers wrapper c++11

28
推荐指数
1
解决办法
1万
查看次数

什么是与Java静态块等效的C++习惯用法?

我有一个带有一些静态成员的类,我想运行一些代码来初始化它们(假设这段代码不能转换成简单的表达式).在Java中,我会这样做

class MyClass {
    static int myDatum;

    static {
        /* do some computation which sets myDatum */
    }
}
Run Code Online (Sandbox Code Playgroud)

除非我弄错了,C++不允许这样的静态代码块,对吧?我应该做什么呢?

我想要解决以下两个选项:

  1. 进程加载时(或加载此类的DLL时)会发生初始化.
  2. 初始化在首次实例化类时发生.

对于第二种选择,我在考虑:

class StaticInitialized {
    static bool staticsInitialized = false;

    virtual void initializeStatics();

    StaticInitialized() {
        if (!staticsInitialized) {
            initializeStatics();
            staticsInitialized = true;
        }
    }
};

class MyClass : private StaticInitialized {
    static int myDatum;

    void initializeStatics() {
        /* computation which sets myDatum */
    }
};
Run Code Online (Sandbox Code Playgroud)

但这是不可能的,因为C++(目前?)不允许初始化非const静态成员.但是,至少可以通过表达式将静态块的问题减少到静态初始化的问题......

c++ java initialization static-block equivalent

28
推荐指数
3
解决办法
1万
查看次数

我可以以constexpr方式获取C++类型名称吗?

我想在编译时使用类型的名称.例如,假设我写了:

constexpr size_t my_strlen(const char* s)
{
        const char* cp = s;
        while(*cp != '\0') { cp++; };
        return cp - s;
}
Run Code Online (Sandbox Code Playgroud)

现在我希望:

template <typename T>
constexpr auto type_name_length = my_strlen(typeid(T).name());
Run Code Online (Sandbox Code Playgroud)

但是,唉,typeid(T).name()只是const char*,而不是constexpr ......还有其他一些constexpr方法来获得一个类型的名字吗?

c++ reflection compile-time constexpr c++14

28
推荐指数
2
解决办法
6440
查看次数

static_cast <T>( - 1)是否生成没有numeric_limits的全1位数据的正确方法?

我正在一个我无法访问C++标准库的环境中编写C++代码,特别是不能访问std::numeric_limits.假设我想实施

template <typename T> constexpr T all_ones( /* ... */ )
Run Code Online (Sandbox Code Playgroud)

专注于无符号整数类型,我放在那里?具体来说,static_cast<T>(-1)够好吗?(根据我的猜测,我可以将其他类型视为无符号字符数组.)

c++ bit-manipulation idiomatic

28
推荐指数
4
解决办法
1341
查看次数

如何在不解压缩的情况下列出zip存档中的文件?

如何ls在不解压缩的情况下从命令shell 获取等效的.zip文件(而不是gzip)?也就是说,如何列出我的.zip存档中压缩的不同文件?

unix linux bash shell zip

27
推荐指数
6
解决办法
5万
查看次数

类似STL对的三胞胎类 - 我自己动手吗?

我想使用一个三元组类,尽可能与std :: pair类似.STL似乎没有.我不想使用太重的东西,比如Boost.是否有一些有用的FOSS非限制性许可三联类可以从某个地方解除?我应该自己动手吗?我应该完全做些什么吗?

编辑:关于std::tuple......

特定于三胞胎的课程真的没有益处吗?我的意思是,有了元组,我做不到

template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;
Run Code Online (Sandbox Code Playgroud)

我可以吗?我不是必须键入dede个人类型组合三元组吗?

c++ c++-standard-library stdtuple triplet

27
推荐指数
3
解决办法
2万
查看次数

如果需要存储删除器,unique_ptr怎么没有开销?

先来看看什么C++入门谈到unique_ptrshared_ptr:
$ 16.1.6.效率和灵活性

我们可以确定shared_ptr不将删除器作为直接成员,因为删除器的类型直到运行时才知道.

因为删除器的类型是a unique_ptr类型的一部分,所以删除器成员的类型在编译时是已知的.删除器可以直接存储在每个unique_ptr对象中.

所以似乎shared_ptr没有直接的删除成员,但unique_ptr确实如此.然而,另一个问题的最高投票回答说:

如果将deleter作为模板参数提供(如unique_ptr),则它是类型的一部分,您不需要在此类型的对象中存储任何其他内容.如果将deleteter作为构造函数的参数传递(如shared_ptr),则需要将其存储在对象中.这是额外灵活性的代价,因为您可以为相同类型的对象使用不同的删除器.

引用的两段完全相互矛盾,让我感到困惑.更重要的是,许多人说unique_ptr是零开销,因为它不需要将删除器存储为成员.但是,正如我们所知,unique_ptr有一个构造函数unique_ptr<obj,del> p(new obj,fcn),这意味着我们可以将删除函数传递给它,因此unique_ptr似乎已将删除函数存储为成员.真是一团糟!

c++ smart-pointers unique-ptr c++-standard-library c++11

27
推荐指数
3
解决办法
3889
查看次数

如何防止 C++ 猜测第二个模板参数?

我正在使用 C++ 库 ( strf ),其中的某处具有以下代码:

namespace strf {
template <typename ForwardIt>
inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ }

template <typename Range, typename CharT>
inline auto range(const Range& range, const CharT* sep) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)在我的代码中使用。但是如果我这样做,我会收到以下错误(使用 CUDA 10.1 的 NVCC):

error: more than one instance of overloaded function "strf::range" matches the argument list:
            function template "auto strf::range(ForwardIt, ForwardIt)"
            function template "auto strf::range(const Range &, const CharT *)" …
Run Code Online (Sandbox Code Playgroud)

c++ nvcc overload-resolution c++11 template-argument-deduction

27
推荐指数
2
解决办法
5474
查看次数