C ++: создание экземпляра шаблонного класса в соответствии с аргументом - PullRequest
2 голосов
/ 26 июня 2011

Я часто нахожу необходимость использовать следующий шаблон:

template<typename T>
class SomeClass : public Base {
   SomeClass(const T& t) {...}
   ...
};
template<typename T>
SomeClass<T>* makeSomeClass(const T& t) {
   return new SomeClass<T>(t);
}

И использовать его:

Base* = makeSomeClass(123);

Это полезно, когда я не хочу явно указывать T потому что он очень сложный (типы функций и т. Д.) И аргумент функции может неявно определять тип.
Есть ли способ сделать это без дополнительной функции make?Почему вывод шаблона работает только в аргументах функции, а не в аргументах конструктора?

Ответы [ 3 ]

3 голосов
/ 26 июня 2011

Это работает в аргументах конструктора, , если , конструктор сам является шаблоном. Разница в том, что когда вы используете свой помощник, вы используете шаблон function , где компилятор может определить тип. Без помощника вы используете шаблон class , где компилятор должен каким-то образом определить тип перед вызовом конструктора (не шаблона).

3 голосов
/ 26 июня 2011

Нет, без дополнительной функции make сделать это невозможно.

Причина, по которой он не работает с конструкторами, заключается в том, что это было бы нелепо сложно. Учтите это:

template <typename T>
struct Foo
{
    Foo(const T& val) { ... }
    Foo(const Foo<T>& other) { ... } // Copy constructor
};

Foo<int> x;

Что если я тогда позвоню:

Foo(x);

Это дает мне Foo< Foo<int> > или я вызываю конструктор копирования для Foo<int>?

Это было бы неоднозначно в слишком многих местах, поэтому необходима дополнительная функция.

Обратите внимание, что вы можете немного автоматизировать создание функций make, используя шаблоны шаблонов:

template <template <typename> class TemplateClass, typename Type>
TemplateClass<Type> make(const Type& x)
{
    return TemplateClass<Type>(x);
}

Тогда вы можете использовать:

make<SomeClass>(123); // returns a SomeClass<int>
0 голосов
/ 26 июня 2011

Есть ли способ без дополнительной функции? Нет, нет Почему удержание работает только для функций? Потому что с функциями вы фактически предоставляете аргументы. Если бы это было разрешено для классов, то единственный способ вывести параметры шаблона был бы в случае, когда для инициализации был вызван конструктор, который создает множество дополнительных правил и исключений и усложняет вещи,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...