Спецификация пакета параметров 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;
};
  1. Есть ли способ удалить int, int из приведенного выше заявления?
  2. Если так, это нормально, чтобы удалить это?
  3. Кроме того, это мой способ создания экземпляров 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)
Другие вопросы по тегам