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

C++ 如何检查模板参数是否可默认构造,c++,templates,implementation,C++,Templates,Implementation,我正在编写一个模板类,想知道模板参数是否存在,是否有任何方法可以做到这一点 代码如下所示 template <class C> class A { createObj() { C* objPtr = NULL; // If default constructible then create object else let it remain NULL } }; 模板 甲级 { createObj() { C*objPtr=NULL; //如果默认可构造,则创建对象,否则将其保持为

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

代码如下所示

template <class C>
class A
{

createObj()
{
C* objPtr = NULL;
// If default constructible then create object else let it remain NULL
}
};
模板
甲级
{
createObj()
{
C*objPtr=NULL;
//如果默认可构造,则创建对象,否则将其保持为空
}
};

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

这是and的经典案例

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

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;
}
SFINAE意味着不能为给定类型实例化的模板将不会被初始化<当且仅当其参数为
true
时,code>enable_if_c基本上会生成有效类型。现在我们使用元函数
is\u default\u constructible
来测试类型
C
是否有默认构造函数。如果是这样,
enable\u If_c::type
将生成有效的类型,否则不会


< > C++编译器将只看到这两个函数中的一个,以便在上下文中使用。有关更多详细信息,请参阅
enable\u if
的文档。

这是SFINAE的一种情况,您使用的函数重载需要。。。作为一个参数,它调用您正在寻找的方法


在任何情况下,这个问题的答案都是“

我不太清楚你的意思。@CashCow的可能重复项该问题没有明确的答案,所以再次询问。为什么不在返回类型上使用enable_if,并防止伪参数的必要性?另外,我相信您需要一个
typename
。@DeadMG:因为这只适用于非
void
。OP没有指定返回类型…@Konrad我没有得到代码,你能详细写一下吗,我也不能使用boost。Thanks@Gaurav:如果无法使用Boost,只需复制
启用模板的标题即可。@Konrad我尝试使用的是可构造的默认值,但它不起作用。特别地,我得到了def const,即使是对于那些不知道会出现什么问题的类:-(.谢谢。
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;
}