我正在写一个模板类,想知道模板参数是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但它不起作用,确切地说,如果返回默认可构造,即使对于那些没有的类,我也不知道为什么会发生这种情况。
答案 0 :(得分:3)
在另一个答案中,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
”