Кратко:

Пакеты параметров функции позволяют функции принимать произвольное количество аргументов разного типа.

Синтаксис

template<typename... Args>
void function(Args... args) {
    // ...
}

Пример кода

Пример 1: Функция с пакетом параметров

#include <iostream>
 
template<typename... Args>
void print(Args... args) {
    (std::cout << ... << args) << std::endl; // Распаковка параметров пакета
}
 
int main() {
    print(1, 2, 3);       // Output: 123
    print("Hello, ", "world!"); // Output: Hello, world!
    print(1.5, 'A', "text"); // Output: 1.5Atext
 
    return 0;
}

Пример 2: Рекурсивная распаковка пакетов параметров

#include <iostream>
 
void print() {
    std::cout << std::endl;
}
 
template<typename T, typename... Args>
void print(T first, Args... args) {
    std::cout << first << " ";
    print(args...); // Рекурсивный вызов для распаковки оставшихся параметров
}
 
int main() {
    print(1, 2, 3);             // Output: 1 2 3
    print("Hello,", "world!");  // Output: Hello, world!
    print(1.5, 'A', "text");    // Output: 1.5 A text
 
    return 0;
}