用C ++包装变量参数函数

时间:2009-07-24 18:48:19

标签: c++ variadic-functions wrapper

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

我要包装的函数的规范是

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

包装(...)

答案 2 :(得分:0)

在某些平台上,这可能是邪恶的黑客攻击。在x86上,参数从右到左被压入堆栈,所以如果你要从堆栈中删除返回地址,推送你的附加参数,然后替换它,你可以(理论上)做你想要的。困难的部分是当你想要用包装器中的返回值做某事时......