【问题标题】:c++: pass arbitrary number of arguments to another functionc ++:将任意数量的参数传递给另一个函数
【发布时间】:2012-09-24 14:24:49
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 你考虑过C++11的variadic templates特性吗?
  • @user1629821 我不相信我可以假设目标机器上安装了 c++11
  • 你的意思是每个函数都用相同的参数执行吗?
  • 没有安装 C++11 之类的东西。您构建了一个没有 C++ 版本概念的可执行文件。除非“目标”是指开发机器。
  • @ZdeslavVojkovic 啊。那么在这种情况下,可变参数模板可能是要走的路。我将不得不研究它,除非你能在这里给我一个简单的例子来说明如何做到这一点

标签: c++ function variadic-functions


【解决方案1】:

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

【讨论】:

    【解决方案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 );
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-03-28
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        • 2022-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多