🤔 Может ли функция иметь переменное число параментов?



Да, функция может принимать переменное число параметров.



🟠Старый стиль

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;

}




Ставь 👍 и забирай 📚 Базу знаний