我有一个功能A(...)
和B(...)
。现在我必须在B
内调用A
,将...
从A
传递到B
的任何方法?伪代码:
void A(...)
{
// Some operators
B(...); // Instead of ... I need to pass A's args
}
P.S。我知道这可以使用宏完成,但功能如何。
答案 0 :(得分:7)
您无法转发va_args。你只能转发va_list。
void vB(int first, va_list ap)
{
// do stuff with ap.
}
void B(int first, ...)
{
va_list ap;
va_start(ap, first);
vB(first, ap);
va_end(ap);
}
void A(int something_else, int first, ...)
{
va_list ap;
va_start(ap, first);
vB(first, ap); // <-- call vB instead of B.
va_end(ap);
}
(这也是vprintf
等函数存在的原因。)
如果您使用的是C ++ 11,则可以使用具有完美转发功能的可变参数模板执行此操作:
template <typename... T>
void A(T&&... args)
{
B(std::forward<T>(args)...);
}
答案 1 :(得分:2)
不幸的是,您无法获取va-list
并将其传递给接受变量参数列表的函数。没有语法允许您将va_args结构扩展回参数。
您可以在单个参数中将其作为va_list
传递,因此一种解决方案是将执行工作的函数定义为va_list
。然后你可以使用参数列表定义另一个包装它的函数,然后可以将va_list
传递给核心函数并将返回值传回。您可以在C标准库中看到这种模式,其中包含printf()
和vprintf()
以及类似的配对。
答案 2 :(得分:1)
您需要稍微更改方法的签名。我假设你想做这样的事情:
void B(int numParams, va_list parameters)
{
// Your code here. Example:
for (int i=0; i<numParams; i++)
{
// Do something using va_arg to retrieve your parameters
}
}
void A(int numParams, ...)
{
va_list parameters;
va_start(parameters, numParams);
B(numParams, parameters);
va_end(parameters);
}