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

C++ c++;:将任意数量的参数传递给另一个函数,c++,function,variadic-functions,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++){

我有一个接受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
    }
}
typedef void(*fptr)(const void*userdata,…);
void execute_all(向量函数,void*userdata,…){

对于(inti=0;i,您应该使用可变模板和C++11中的完美转发


如果你没有,那么这里有一个Boost库,可以模仿你使用。

你应该使用可变模板和C++11中的完美转发


如果您没有,那么有一个Boost库可以为您模拟这些函数。

您不能直接将变量参数从一个变量函数传递到另一个变量函数。但是,您可以让被调用的(内部)函数接受一个
va_列表
,然后传递该列表:

#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);
}
#包括
作废被调用方(作废*第一,VAU列表参数);
作废调用者(作废*第一,…)
{
va_列表参数;
va_启动(args,第一);
被叫方(第一,args);
va_端(args);
}

您不能直接将变量参数从一个变量函数传递到另一个变量函数。但是,您可以让被调用的(内部)函数接受一个
变量列表
,然后传递该列表:

#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);
}
#包括
作废被调用方(作废*第一,VAU列表参数);
作废调用者(作废*第一,…)
{
va_列表参数;
va_启动(args,第一);
被叫方(第一,args);
va_端(args);
}

无法有效地将变量函数的参数移动到另一个函数,但可以将堆栈移动到另一个函数,这样它就可以从堆栈本身窥视参数。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 );
    }
}
void fwd_函数(int argCount,…){
va_列表变量;
va_启动(变量、argCount);
impl_函数(argCount,vargs);
va_端(vargs);
}
void impl_函数(int argCount、va_list args){
int i;
对于(i=0;i
无法有效地将变量函数的参数移动到另一个函数,但可以将堆栈移动到另一个函数,这样它就可以从堆栈本身窥视参数。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 );
    }
}
void fwd_函数(int argCount,…){
va_列表变量;
va_启动(变量、argCount);
impl_函数(argCount,vargs);
va_端(vargs);
}
void impl_函数(int argCount、va_list args){
int i;
对于(i=0;i<代码> >你考虑过C++ 11的可变模板特性吗?@ USE1629 821?我不相信我可以假设C++ 11被安装在目标机器上。你是说每个函数都是用相同的参数来执行的吗?没有安装C++ 11的东西。你可以构建一个没有C++版本的概念。你指的是开发机器。@ZdeslavVojkovic啊。在这种情况下,可变模板可能是最好的选择。我必须研究一下,除非你能在这里给我一个简单的例子说明如何做。你考虑过C++11的可变模板功能吗?@user1629821我不相信我能假设C++11安装在目标机器上,对吗每个函数都是用相同的参数执行的,没有安装C++ 11的东西。你可以建立一个没有C++版本的可执行文件。除非用“目标”来表示开发机器。@ ZDLVAVOJKOVICIC。我举一个简单的例子来说明怎么做