Назад к вопросам
Middle
96
questionbank
Может ли шаблон в C++ иметь переменное число аргументов?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Да, может. Такие шаблоны называются вариативными.
Они используют синтаксис упаковки и распаковки параметров:
- Аргумент-пак:
typename... ArgsилиT... args. Многоточие...указывает, что за ним следует пак параметров шаблона или пак аргументов функции. - Распаковка (Expansion):
func(args...)илиTemplate<Args...>в теле другого шаблона. Многоточие...здесь означает распаковку пака в отдельные элементы.
Примером может служить реализация функции печати с переменным числом аргументов, схожей с printf:
#include <iostream>
// Базовый случай рекурсии
void print() {
std::cout << std::endl;
}
// Рекурсивный шаблон для обработки аргументов
template <typename T, typename... Args>
void print(T value, Args... args) {
std::cout << value << " ";
print(args Аргумент-пак ...); // Распаковка оставшихся аргументов
}
int main() {
print(1, "hello", 3.14);
print("just one argument");
return 0;
}
В данном примере шаблон print рекурсивно обрабатывает аргументы: первый аргумент value обрабатывается, а оставшиеся аргументы Args... args передаются рекурсивным вызовом функции print(args...). Базовый случай void print() останавливает рекурсию, когда аргументы заканчиваются.