2012-10-03 49 views
1

我有一个函数需要3个参数。一个其他函数的向量,一个void *和一个任意的参数列表。该函数设计为将void *和任意参数列表传递给列表中的每个函数,函数将处理它们自己。这里是我想要的一个例子:C++:将任意数量的参数传递给另一个函数

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

你有没有考虑C++ 11的_variadic templates_特性? –

+1

@ user1629821我不相信我能假设C++ 11安装在目标机器上 – ewok

+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

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

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

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); 
    } 
} 
相关问题