C ++ варианты c шаблоны с повторяющимися типами - PullRequest
0 голосов
/ 13 июля 2020

Можно ли писать вариативные c шаблоны или выражения сворачивания, где сигнатура функции может быть чем-то вроде

void f(int, string, int, string, ...)

Этот стиль очень популярен и удобен для пользователя в python, но я не мог не заставить его работать в C ++. В частности, я бы использовал его для подачи в функцию построения графика данных, за которыми следует, например, метка.

edit: чтобы развернуть, я хотел бы вызвать функцию следующим образом:

f(5, "first number");
f(5, "first number", 6, "second number");

и с параметрами 4, 6 или ... 2 * n.

Ответы [ 2 ]

5 голосов
/ 13 июля 2020

Вы можете написать функцию Variadi c следующим образом:

template<typename ...Ts>
void f(int data, string const &label, Ts&&... rest)
{
  process(data, label);
  f(std::forward<Ts>(rest...));
}

с базовым случаем:

void f() {}

, чтобы завершить рекурсию.

Теперь будут компилироваться только вызовы формы:

f(1, "hi");           // ok
f(1, "hi", 2, "bye"); // ok
// etc

, тогда как:

f(1);          // error
f("hi");       // error
f(1, "hi", 2); // error

не будут.

1 голос
/ 13 июля 2020

Например, определите две перегрузки:

void f() {}

template<class... Ts>
void f(int i, std::string s, Ts... ts) {
    f(std::move(ts)...); // static recursion
}
...