使用另一个可变参数函数的未命名参数调用可变参数函数
我有两个可变函数作为foo(format, ...)
和bar(format, ...)
。 我想实现函数foo
以便它可以使用相同的参数列表调用bar
。 那是,
foo(format...) { ... bar(format, ...); }
例如,调用foo("(ii)", 1, 2)
将调用具有相同参数bar("(ii)", 1, 2)
。 该foo
函数应如何实现?
PS:functionbar
来自遗留库,我无法更改其界面。
无法完成,只要你拥有的只是一堆函数与...
参数。
你必须提前计划这样的事情,并以两个阶段的方式实现每个可变的function
void vfoo(format, va_list *args) { /* Process `*args` */ } void foo(format, ...) { va_list args; va_start(args, format); vfoo(format, &args); va_end(args); }
通过一对va_list *
函数和...
函数实现每个可变参数函数后,可以使用va_list *
版本的函数委派调用
void vfoo(format, va_list *args) { ... vbar(format, args); ... }
GCC可以在运行时构造函数调用 。
foo() { void *args = __builtin_apply_args(); void *ret = __builtin_apply(bar, args, ???); __builtin_return(ret); }
???
是参数占用的堆栈空间量,计算时不一定是微不足道的:您需要了解参数是什么以及有关如何传递它们的特定于体系结构的详细信息。
其他GCC扩展允许进一步使用宏和内联函数。
简短的回答 – 你不能。 让酒吧拿一个va_list
。 如果您愿意将其锁定到一个特定的编译器,您可以使用内联汇编来实现,但使用标准C或C ++则无法实现。
作为一般规则,您应该始终使用va_list
实现vararg函数,然后创建一个包装省略号函数来调用真正的va_list
函数。
这适用于C ++:
#include template void meheer(const Format& format) { std::cout << format << std::endl;; } template void meheer(const Format& format, const Elt & e, const Args&... args) { std::cout << format << e; meheer(format, args...); } template void ohai(const Format& format, const Args&... args) { meheer(format, args...); } int main(int argc, char ** argv) { ohai(1,2,3); return EXIT_SUCCESS; }
输出:
12131
当然,这是特定于C ++ 0x的,但它适用于我的非最新版本的gcc。 另见: http : //en.wikipedia.org/wiki/C%2B%2B0x#Variadic_templates
更新添加的完整示例。