1

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

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

谢谢

4

3 回答 3

3

您不能直接将可变参数从可变参数函数传递给另一个可变参数函数。但是,您可以让被调用的(内部)函数接受 a 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);
}
于 2012-10-03T15:58:23.313 回答
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 );
    }
}
于 2012-10-03T16:01:34.013 回答
1

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

如果您没有,AFAIK 有一个 Boost 库可以为您模仿这些库。

于 2012-10-03T15:56:31.620 回答