如何检查模板参数是否是默认可构造的

时间:2011-01-12 13:08:43

标签: c++ templates implementation

我正在写一个模板类,想知道模板参数是default constructible是否有任何方法可以做到这一点?

代码如下所示

template <class C>
class A
{

createObj()
{
C* objPtr = NULL;
// If default constructible then create object else let it remain NULL
}
};

更新:我已经尝试过使用code given in this question但它不起作用,确切地说,如果返回默认可构造,即使对于那些没有的类,我也不知道为什么会发生这种情况。

2 个答案:

答案 0 :(得分:3)

这是SFINAEenable_if的经典案例。

在另一个答案中,Potatoswatter已经发布了一个可以在这里重复使用的类型特征is_default_constructible

void createObj(
    typename enable_if_c<is_default_constructible<C>::value, void>::type* dummy = 0)
{
     C* objPtr = new C();
}

void createObj(
    typename disable_if_c<is_default_constructible<C>::value, void>::type* dummy = 0)
{
     C* objPtr = 0;
}

或者,如果您的函数具有非void返回类型T(感谢DeadMG),您可以省略伪默认参数:

typename enable_if_c<is_default_constructible<C>::value, T>::type createObj()
{
     C* objPtr = new C();
}

typename disable_if_c<is_default_constructible<C>::value, T>::type createObj()
{
     C* objPtr = 0;
}

SFINAE意味着无法为给定类型实例化的模板不会。当且仅当其参数为enable_if_c时,true基本上会生成有效类型。现在我们使用元函数is_default_constructible来测试类型C是否具有默认构造函数。如果是这样,enable_if_c<…>::type将导致有效类型,否则将不会。

因此,C ++编译器只能看到两个函数中的一个,即在您的上下文中可用的函数。有关详细信息,请参阅enable_if的文档。

答案 1 :(得分:1)

这是SFINAE的一个例子,你使用一个函数重载,一个将...作为参数,一个调用你正在寻找的方法。

无论如何,这个特定问题的答案是“here