Да, функция может принимать переменное число параметров.
C использованием заголовочного файла
<cstdarg>
и соответствующих макросов.C использованием вариадических шаблонов, введенных в C++11.
Для создания функции с переменным числом параметров в старом стиле используется заголовочный файл
<cstdarg>
и макросы va_start
, va_arg
и va_end
. Это подходит для функций, которые принимают параметры одного типа или могут обрабатывать параметры разных типов с помощью приведения типов.#include <cstdarg>
#include <iostream>
void printNumbers(int count, ...) {
va_list args; // Объявление объекта для хранения аргументов
va_start(args, count); // Инициализация списка аргументов
for (int i = 0; i < count; ++i) {
int num = va_arg(args, int); // Получение следующего аргумента
std::cout << num << " ";
}
va_end(args); // Завершение работы со списком аргументов
std::cout << std::endl;
}
int main() {
printNumbers(3, 1, 2, 3); // Вывод: 1 2 3
printNumbers(5, 10, 20, 30, 40, 50); // Вывод: 10 20 30 40 50
return 0;
}
Вариадические шаблоны позволяют создавать более гибкие и типобезопасные функции с переменным числом параметров. Вариадические шаблоны поддерживают параметры разных типов и могут быть использованы с современными методами обработки типов (например,
std::tuple
, std::apply
и std::initializer_list
).#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); // Вывод: 1 2 3
print("Hello", 1, 2.5, 'A'); // Вывод: Hello 1 2.5 A
return 0;
}
Ставь 👍 и забирай 📚 Базу знаний