c ++: передать произвольное количество аргументов другой функции

У меня есть функция, которая принимает 3 аргумента. вектор других функций, void * и произвольный список аргументов. Функция предназначена для передачи ей void * и произвольного списка аргументов каждой функции в списке, с которой функции будут работать сами. вот пример того, что я хочу:

typedef void (*fptr)(const void* userdata, ...);

void execute_all(vector<fptr> funcs, void* userdata, ...){
for (int i = 0;i<funcs.size();i++){
fptr func = funcs[i];
//execute func with userdata and ... from above.
//like (*func)(userdata, ...); which obviously doesnt work
}
}

Мне нужно знать, как направить все аргументы в каждую функцию. Не беспокойтесь об обеспечении совместимости. Я занимаюсь этим в другом месте.

Спасибо

1

Решение

Вы не можете напрямую передать переменные аргументы из функции с переменным числом в другую функцию с переменным числом. Однако вы можете заставить вызываемую (внутреннюю) функцию принимать va_listзатем передайте этот список:

#include <cstdarg>

void callee(void *first, va_list args);

void caller(void *first, ...)
{
va_list args;
va_start(args, first);
callee(first, args);
va_end(args);
}
3

Другие решения

Невозможно эффективно переместить аргументы переменной функции в другую функцию, но вы можете переместить свой стек в другую функцию, чтобы он мог извлекать аргументы из самого стека. Анси C представить va_list только для этого. Вы можете иметь следующий код:

void fwd_function( int argCount, ... ) {
va_list vargs;
va_start( vargs, argCount );
impl_function( argCount, vargs );
va_end( vargs );
}
void impl_function( int argCount, va_list args ) {
int i;
for( i = 0; i < argCount; i++ ) {
int arg = va_arg( args, int );
}
}
2

Вы должны использовать шаблоны с переменным числом и безупречную пересылку в C ++ 11.

Если у вас этого нет, AFAIK есть библиотека Boost, которая будет имитировать их для вас.

1
По вопросам рекламы [email protected]