有条件地启用构造函数

时间:2011-03-20 00:01:33

标签: c++ constructor conditional

以下是我可以有条件地启用类的构造函数的方法:

struct Foo
{

    template<class T>
    Foo( T* ptr, boost::enable_if<is_arithmetic<T> >::type* = NULL )
    {}

};

我想知道为什么我需要通过虚拟参数进行启用。为什么我不能写:

struct Foo
{
    template<class T>
    Foo( boost::enable_if<is_arithmetic<T>, T>::type* = NULL )
    {}
};

1 个答案:

答案 0 :(得分:8)

除了构造函数之外,您可以使用任何其他函数,因为这样您就可以修改函数名称,包括模板参数。

Foo foo;
foo.Method<T>();

但是,使用构造函数时,构造函数名称永远不会出现在表达式中,因此无法显式放置模板参数。你必须从论证中推断出它。

Foo<T> foo; // no good, assumes the type Foo is a template, not its constructor
Foo* pfoo = new Foo<T>(); // same problem

Foo foo((T*)0); // ok, deduced
Foo* pfoo = new Foo((T*)0); // same