Должен ли я явно показывать типы в пакете параметров при создании экземпляра шаблона?
У меня есть пример, иллюстрирующий мой вопрос:
#include <utility>
class Foo {
public:
Foo(int i) {}
};
template<typename T, typename ...Args>
class Bar {
public:
T t;
Bar(Args &&... args) : t(std::forward<Args>(args)...) {}
};
и если я хочу создать экземпляр этого шаблона:
Bar<Foo> foo(1);
компилятор выдает ошибку:
no matching function for call to ‘Bar<Foo>::Bar(int)’
Поэтому я должен написать следующее:
Bar<Foo, int> foo(1);
Это раздражает, особенно если у меня есть классы с длинным списком параметров.
Итак, есть ли способ избавиться от явного отображения типов в пакетах параметров
1 ответ
Решение
Если вы хотите, чтобы конструктор вперед, сделать что шаблон
template<typename T>
class Bar {
public:
T t;
template<typename ...Args>
Bar(Args &&... args) : t(std::forward<Args>(args)...) {}
};
Обычно мы заботимся только о типах аргументов во время инициализации t
, тем не мение.