我正在尝试检查模板参数是否存在默认构造函数。
我想做这样的事情:
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
}