繁体   English   中英

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

[英]c++: pass arbitrary number of arguments to another function

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

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

谢谢

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

您无法有效地将可变参数的参数移至另一个函数,但是您可以将堆栈移至另一个函数,以便它可以从堆栈本身窥视参数。 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 );
    }
}

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

如果您不具备此功能,则AFAIK拥有一个Boost库,可以为您模仿这些库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM