условно разрешающий конструктор - PullRequest
7 голосов
/ 20 марта 2011

Вот как я могу условно включить конструктор класса:

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 Ответ

8 голосов
/ 20 марта 2011

Вы можете использовать любую другую функцию, кроме конструктора, потому что тогда вы можете изменить имя функции, включая аргументы шаблона.

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
...