Variadic template
Variadic template - это шаблон, который принимает переменное число параметров. С его помощью можно создавать функции и классы, работающие с любым количеством аргументов произвольных типов. Параметры шаблона упаковываются в так называемый пакет параметров (parameter pack), который обозначается многоточием после имени. Распаковка пакета выполняется с помощью многоточия после выражения.
Синтаксис
template <typename... Args>
void func(Args... args)
{
// ...
}
Здесь Args - это пакет типов, а args - пакет значений.
Распаковать пакет можно, например, через рекурсию или свёртку (fold expression).
Пример
Давайте напишем функцию print, которая выводит на экран
произвольное количество аргументов:
#include <iostream>
using namespace std;
void print()
{
cout << endl;
}
template <typename T, typename... Args>
void print(T first, Args... rest)
{
cout << first << " ";
print(rest...);
}
int main()
{
print(1, 2.5, "abcde", 'x');
return 0;
}
Результат выполнения кода:
"1 2.5 abcde x"
Пример
Давайте посчитаем сумму произвольного количества чисел с помощью свёртки (fold expression):
#include <iostream>
using namespace std;
template <typename... Args>
auto sum(Args... args)
{
return (args + ...);
}
int main()
{
cout << sum(1, 2, 3, 4, 5) << endl;
return 0;
}
Результат выполнения кода:
15
Пример
Давайте узнаем количество переданных аргументов
с помощью оператора sizeof...:
#include <iostream>
using namespace std;
template <typename... Args>
void countArgs(Args... args)
{
cout << sizeof...(args) << endl;
}
int main()
{
countArgs(1, 2, 3);
countArgs("abcde", "12345");
return 0;
}
Результат выполнения кода:
3
2