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

时间:2012-12-09 10:04:53

标签: 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>()

2 个答案:

答案 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的编译器)。