c ++转发函数调用

时间:2017-05-15 09:36:46

标签: c++ variadic-functions

是否可以将函数的参数列表传送到另一个函数?

例如在我的functionA中,我想用varargs列表中的参数调用我的functionB / functionC(取决于执行状态)。请注意,我无法更改functionB / functionC声明。

int functionA(int a, ...){
    ...
    va_list listPointer;
    va_start( listPointer, a);
    ...
}

int functionB(long b, long c, long d){
    ...
    ...
}

int functionC(long b, int c, int d){
    ...
    ...
}

对于这个项目,我使用gcc 4.9.1。

我到目前为止尝试的是从listPointer传递void *但是它没有用...

从va_list中提取变量也行不通,因为我有80个其他similair函数应该从functionA调用,这意味着我无法提取参数并通过提取的值调用。

也许有办法复制functionA参数的内存并用指针调用functionB / functionC?有没有人知道如何做到这一点?

3 个答案:

答案 0 :(得分:2)

如果您无法更改功能B,则必须从functionA va列表中提取参数:

#include <stdarg.h>
#include <stdio.h>

int functionB(long b, long c, long d)
{
    return printf("b: %d, c: %d, d: %d\n", b, c, d);
}

int functionA(int a, ...)
{
    ...
    va_list va;
    va_start(va, a);
    long b = va_arg(va, long);
    long c = va_arg(va, long);
    long d = va_arg(va, long);
    va_end(va);
    return functionB(b, c, d);
}
  

也许有办法复制functionA参数的内存并用指针调用functionB / functionC?有没有人知道如何做到这一点?

然后,这意味着您必须更改functionBfunctionC等的声明。您可以将其更改为接受va_list

int functionA(int a, va_list args);
int functionC(int c, va_list args);

答案 1 :(得分:1)

如果longs中只有va_args可以使用。

int functionA(int a, ...){
    va_list listPointer;
    va_start( listPointer, a);
    long b = va_arg(listPointer, long);
    long c = va_arg(listPointer, long);
    long d = va_arg(listPointer, long);
    va_end(listPointer);
    return functionB(b, c, d);
}

答案 2 :(得分:1)

您无法更改B的签名,但是您可以更改A的签名吗? 如果是这样,这可能是一个不错的选择:

template <typename... Args>
int functionA(Args&& ... args)
{
    return functionB(std::forward<Args>(args)...);
}