c++ - 在编译时检测是否存在默认构造函数

标签 c++ templates constructor sfinae

<分区>

我正在尝试检查模板参数是否存在默认构造函数。 我想做这样的事情:

template <typename A>
class Blah
{
   Blah() { A* = new A(); } 
}

但我想在编译时通过 SFINAE 或其他技巧检测该构造函数是否存在,并引发 static_assert如果没有,我自己的。

当我的类(如 std::vector)没有“默认构造函数”但具有默认参数的构造函数时,问题就出现了。

所以使用 std::has_trivial_default_constructor不会返回 true。虽然我可以使用 new vector<T>() .

最佳答案

这是类型特征的可能实现:

template<typename T>
class is_default_constructible {

    typedef char yes;
    typedef struct { char arr[2]; } no;

    template<typename U>
    static decltype(U(), yes()) test(int);

    template<typename>
    static no test(...);

public:

    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

struct foo {
    foo(int) {}
};

int main()
{
    std::cout << is_default_constructible<foo>::value << '\n'        // 0
              << is_default_constructible<std::vector<int>>::value;  // 1
}

关于c++ - 在编译时检测是否存在默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13786482/

相关文章:

c++ - 从成员 get 方法返回 const 引用

c++ - 为什么聚合推导中不支持大括号初始化列表但支持大括号省略?

C++ 模板用法

c++ - 如何调用基类构造函数?

c++ - 重新分配变量,调用两次删除 (C++)

c++ - 在C++中接受多个字符串作为输入

c++ - 命名管道,选择错误的文件描述符 C++

c++ - 将直接字符串传递给 C++ 中的模板

c++ - 为什么枚举不能是模板?

c++ - move 和转发案例使用