Как сделать функцию, обрабатывающую неизвестное кол-во переменных?
Функция вроде и обрабатывает значения, но добавляет ещё откуда то из вне, не знаю как переписать нормально или по другому.
void MyFunc(int a,...){
int *P=&a;
while (*P){
cout << *P <<" ";
P+=sizeof(int)/2;
}
}
int main(){
MyFunc(4,3,2,1,5,6,7,8,5);
}
Ответы (1 шт):
Старыми сишными ... аргументами в C++ лучше не пользоваться, потому что они никак не дают защититься от передачи аргументов неправильных типов (или неправильного количества).
Лучше всего использовать std::span:
#include <iostream>
#include <span>
void foo(std::span<const int> s)
{
for (int x : s)
std::cout << x << '\n';
}
int main()
{
foo({{1,2,3,4}}); // В С++26 можно с одинарными `{...}`.
// Или так:
int arr[] = {1,2,3};
foo(arr);
}
Есть еще варианты с std::vector, std::initializer_list, или со ссылкой на массив, но это все хуже, потому что заставляет пользователя создавать определенный контейнер.
А span принимает любой контейнер, в котором элементы расположены в памяти подряд.
Есть еще вариант с шаблоном с переменным количеством аргументов. Казалось бы, красивый синтаксис без фигурных скобок, но он добавляет проблем: функцию нельзя спрятать в .cpp-шник; вам могут передать аргументы разных типов и надо как-то нормально с этим справиться (вызвать ошибку компиляции или сконвертировать в нужный тип); количество элементов фиксируется во время компиляции (если вам это низачем не нужно, то лучше не ограничивать пользователя).
#include <iostream>
template <typename ...P>
void foo(const P &... s)
{
((std::cout << s << '\n'), ...);
}
int main()
{
foo(1,2,3,4);
}
Если хочется сделать совсем красиво и нет отвращения к шаблонам, тогда используйте C++20 ranges. Работает как первый вариант, но принимает совершенно любой контейнер.
#include <concepts>
#include <initializer_list>
#include <iostream>
#include <ranges>
template <std::ranges::input_range R = std::initializer_list<int>>
requires std::same_as<std::ranges::range_value_t<R>, int>
void foo(R&& range)
{
for (int x : range)
std::cout << x << '\n';
}
int main()
{
foo({1,2,3,4});
// Или так:
int arr[] = {1,2,3};
foo(arr);
}