Пакет параметров
Пакет параметров (parameter pack) - это механизм
вариативных шаблонов в C++, который позволяет
шаблону принимать ноль или более аргументов.
Пакет может содержать параметры типов, параметры
шаблонов-шаблонов или параметры-значения.
Объявляется пакет с помощью многоточия ...
после имени параметра. При раскрытии пакета
многоточие ставится после выражения, содержащего
пакет. Чаще всего пакет используется в паре с
рекурсией или свёрткой (fold expression) для
обработки всех переданных аргументов.
Синтаксис
// Объявление пакета параметров типа
template <typename... Args>
void func(Args... args);
// Раскрытие пакета в списке аргументов
func(args...);
// Раскрытие пакета в списке базовых классов
template <typename... Bases>
struct Derived : Bases... { };
Пример
Давайте напишем шаблонную функцию 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, 3, 4, 5);
print("abcde", "12345");
return 0;
}
Результат выполнения кода:
1 2 3 4 5
"abcde" "12345"
Пример
Давайте посчитаем количество переданных
аргументов с помощью оператора sizeof...:
#include <iostream>
using namespace std;
template <typename... Args>
void count(Args... args)
{
cout << sizeof...(args) << endl;
}
int main()
{
count(1, 2, 3);
count("abcde");
count();
return 0;
}
Результат выполнения кода:
3
1
0
Пример
Давайте вычислим сумму всех переданных аргументов с помощью свёртки (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