Назад к вопросам
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() останавливает рекурсию, когда аргументы заканчиваются.