Аргументы шаблона C ++ в конструкторе - PullRequest
3 голосов
/ 19 августа 2010

Почему этот код не компилируется?

template <class T>
class A
{
    public:
            A(T t) : t_(t) {}

    private:
            T t_;
};


int main()
{
    A a(5.5);
    // A<double> a(5.5); // that's what i don't want to do
}

Я хочу, чтобы аргументы шаблона были неявными.

Как в этом примере:

template<class T>
T Foo(T t) { return t; }

// usage:
Foo(5.5);

ОБНОВЛЕНИЕ : идиома именованного конструктора для меня неприемлема. Я хочу использовать этот класс для RAII. Единственный способ сделать это - const A& a = A::MakeA(t), но это ужасно!

1 Ответ

9 голосов
/ 19 августа 2010

Поскольку вы должны назвать тип переменной (C ++ 03 не может определить тип переменной), вы можете сделать только:

A<double> a(5.5); // that's what i don't want to do

Ситуация немного проще, когдавам не нужно создавать переменную типа, но вы хотите передать ее другой функции.В этом случае вы определяете вспомогательную «функцию конструктора» (см. std::make_pair):

template <class T>
A<T> make_a(T t) { return A<T>(t); }

, а затем используете ее следующим образом:

another_function(make_a(1.1));

В C ++ 0x,вы сможете даже

auto a(make_a(5.5));

определить свою переменную a.

Однако вывести аргумент A из его конструктора, как правило, невозможно, потому что вы можете 't сказать, какие специализации имеют конструктор преобразования из данного типа.Представьте, что есть специализация

template <>
struct A<void>
{
  A(double);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...