Я искал, как объявить функции или члены класса с переменным числом аргументов, и столкнулся с вариативными функциями, однако мне было интересно, есть ли какой-то способ получить доступ к количеству аргументов, передаваемых в функцию, без необходимость передавать его напрямую в качестве первого аргумента, как показано в большей части документации. Я также знаю, что могу использовать либо шаблоны с переменным числом аргументов, либо std::initializer_list
, но, поскольку я хотел передать несколько аргументов одного и того же типа, они кажутся слишком общими и/или с запутанным синтаксисом.
#include <cstdarg>
bool func(int args...) {
va_list list;
va_start(list, args);
int val = args;
while(val >=0) {
std::cout << val << std::endl;
val = va_arg(list, int);
}
return true;
}
bool other_func(int c, int args...) {
va_list list;
va_start(list, args);
int val = args;
for (int i = 0; i<c; i++) {
std::cout << val << std::endl;
val = va_arg(list, int);
}
return true;
}
int main(int argc, char const *argv[]) {
func(2, 7, 47, -1, 23 /* ignored */);
other_func(3 /* n of parameters */, 2, 7, 47);
return 0;
}
В этом конкретном примере func
перебирает входные аргументы до тех пор, пока не будет найдено отрицательное значение (чтобы проиллюстрировать проблему и установить флаг остановки), в то время как other_func
требует, чтобы количество аргументов было передано в качестве первого аргумента. Обе эти реализации показались мне довольно ущербными и небезопасными, есть ли лучший способ подойти к этому?
va_end
ни в одной из своих функций. Это была бы веская причина предпочесть подход C++. - person Stephen Newell   schedule 15.09.2020