Спецификация пакета параметров C++ в конструкторе, а не в шаблоне
В отличие от объявлений функций с пакетами параметров, я обнаружил, что классы требуют тип для каждого аргумента в угловых скобках...
Component<IntegerPair, int, int> temp(40, 5);
... который кажется излишним. Вот как я определил Component
:
template<typename T, class... T_Args>
class Component
{
public:
Component(T_Args... args)
: m_data(args...)
{}
T m_data;
};
- Есть ли способ удалить
int, int
из приведенного выше заявления? - Если так, это нормально, чтобы удалить это?
- Кроме того, это мой способ создания экземпляров
m_data
безопасный? Когда используешьstd::forward<T_Args>(args)...
мой компилятор сказал мне, что у меня нет конструктора, который мог бы конвертировать все типы аргументов.
2 ответа
Решение
Один из способов - сделать конструктор шаблоном:
#include <utility>
struct IntegerPair {
IntegerPair(int, int) {}
};
template<typename T>
class Component
{
public:
template<typename... T_Args>
Component(T_Args&&... args)
: m_data(std::forward<T_Args>(args)...)
{}
T m_data;
};
int main()
{
Component<IntegerPair> c {1,2};
}
Это функционально эквивалентно std::vector
и его функция-член emplace_back
, Это совершенно нормально, ИМО. Сообщения об ошибках довольно загадочны, как обычно в шаблонных конструкциях, как это, но это может быть смягчено с помощью соответствующего static_assert
,
Вывод параметров шаблона работает только для вызовов функций, поэтому базовый шаблон для достижения желаемого выглядит следующим образом:
template<typename T, class... T_Args>
Component<T, T_Args...> makeComponent(T_Args&&... args) {
return Component<T, T_Args...>(std::forward<T_Args>(args)...);
}
Использование:
auto c = makeComponent<IntegerPair>(1, 1)