我正在尝试检查模板参数是否存在默认构造函数。 我想做这样的事情:
template <typename A>
class Blah
{
Blah() { A* = new A(); }
}
但是我希望在编译时通过 SFINAE 或其他一些技巧(如果该构造函数存在)进行检测,如果不存在,则提出我自己的static_assert
。
当我的类(如std::vector
)没有“默认构造函数”但是具有默认参数的构造函数时,会出现问题。
因此使用std::has_trivial_default_constructor
将不会返回true。虽然我可以使用new vector<T>()
。
答案 0 :(得分:6)
以下是类型特征的可能实现:
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
}
答案 1 :(得分:3)
C ++标准中没有std::has_trivial_default_constructor
;这似乎是来自Boost的gcc增强功能。这不是你想要的。你不想检查某些东西是否有一个简单的默认构造函数;你想检查一些类是否有一个默认的构造函数,无论是否琐碎。使用std::is_default_constructible
(假设符合c ++ 11的编译器)。