c ++:将任意数量的参数传递给另一个函数

时间:2012-10-03 15:53:17

标签: c++ function variadic-functions

我有一个带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
    }
}

我需要知道如何将所有参数转发到每个函数中。不要担心确保兼容性。我在其他地方处理。

由于

3 个答案:

答案 0 :(得分:3)

您不能直接将可变参数从可变参数函数传递给另一个可变参数函数。但是,您可以使被调用(内部)函数接受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);
}

答案 1 :(得分:2)

您无法有效地将可变参数函数的参数移动到另一个函数,但您可以将堆栈移动到另一个函数,因此它可以从堆栈本身查看参数。 Ansi 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 :(得分:1)

您应该使用可变参数模板并在C ++ 11中完善转发。

如果你没有,那么AFAIK就有一个Boost库可以模仿你的那些。