【问题标题】:Wrap a variable parameter function in C++在 C++ 中包装可变参数函数
【发布时间】:2009-07-24 18:48:19
【问题描述】:

我想将 xmlrpc“调用”函数(它采用可变数量的参数)与另一个函数(也采用可变数量的参数)包装起来。我想简单地将传入我的包装函数的可变数量的参数转发给 xmlrpc“调用”函数。 我知道如何使用 va_start 和 va_arg,但我真的不关心传入的值,我只是想将它们转发给包装函数。 这可能吗?

我想包装的函数的规格是

call(const char* url, const char* function, const char* paramSpec, void* result, ...);

我的包装器处理前三个参数和按引用的结果,它只需将其额外参数转发给调用函数

【问题讨论】:

    标签: c++ variadic-functions wrapper


    【解决方案1】:

    不幸的是,没有办法通过... 语法提供对带有可变数量参数的函数的完美转发。这就是为什么最佳实践是根据采用va_list 的函数来实现所有公共变量参数列表函数,并为任何客户端代码提供这两个接口。这就是为什么标准库中有printfvprintfsprintfvsprintf等。

    如果没有vcall 或类似的va_list,那么就没有简单的方法可以做你想做的事。唯一的可能性是解释其他参数,以根据提供的固定参数计算出传递给函数的变量参数列表中必须包含的内容,将变量参数列表中的所有参数拉入单独的变量中,并制作一个数字根据提取的参数的数量和类型,可能显式调用call。完全笼统地做到这一点是不可能的。

    【讨论】:

      【解决方案2】:

      是的,如果您可以控制包装函数,请从“...”更改为 va_list。以 vprintf 为例。

      不确定是否可以用另一个 (...) 换行 (...)

      【讨论】:

      • 你知道语言需要什么吗?他们需要一个将数组(或本例中为 va_args)扩展为参数的构造,这样我们就不必在每次出现此问题时编写单独的函数来处理数组输入...
      • C++0x 会得到可变模板,基本就是这个。你递归地处理这样的输入。
      【解决方案3】:

      这可能在某些平台上通过恶意黑客来实现。在 x86 上,参数从右到左压入堆栈,因此如果您要从堆栈中删除返回地址,压入您的附加参数,然后替换它,您可以(理论上)做您想做的事。困难的部分是当你想要对包装器内的返回值做一些事情时......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多