Как реализовать шаблон с переменным числом, чтобы пересылать переменное число аргументов в функцию в C ++ 11? - PullRequest
2 голосов
/ 24 июня 2019

В Python я могу использовать *args, чтобы разрешить переменное количество входов в функцию.Например, следующий фрагмент выведет все аргументы, переданные при вызове f:

def f(*args):
  for a in args:
    print(a)

Я хотел бы иметь возможность реализовать такой шаблон в C ++ 11 со следующими требованиями:

Функция f всегда будет принимать значение определенного типа T, а затем переменное число входов после;потенциально, это включает 0 дополнительных входов.

Дополнительные входы не обязательно относятся к одному типу, поэтому использование списка инициализаторов не будет работать.

Функция f будет вызываться другимфункция g, которая должна будет пересылать необязательные аргументы в f:

T g(const T& x, args...) {
  T output = f(x, args...);
  return output;
};

T f(const T& x, args...) {
  // do some stuff and return an object of type T
};

Как я могу решить эту проблему проектирования?Я пробовал вариадические шаблоны, но не могу заставить мою реализацию работать правильно (компилируется, но не связывается из-за проблем со ссылками на rvalue).

1 Ответ

4 голосов
/ 24 июня 2019

Вот как вы написали бы это на C ++:

template <class... A>
T f(const T &x, A &&... arg)
{
  // do some stuff and return an object of type T
}

template <class... A>
T g(const T &x, A &&... arg)
{
  T output = f(x, std::forward<A>(arg)...);
  return output;
}

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

...