2017-05-15 56 views
1

是否可以將函數的參數列表傳遞給另一個函數?C++轉發函數調用

例如在我的函數中,我想用可變參數列表中的參數調用我的函數B /函數C(取決於執行狀態)。請注意,我不能更改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虛空*,但它並沒有從va_list的工作...

提取變量也不會起作用,因爲我有一個像其他80種similair功能,這應該從函數A調用,這意味着我無法提取參數並通過提取的值調用。

也許有一種方法可以複製functionA參數的內存,並用指向它的函數調用functionB/functionC?有沒有人有一個如何可能的想法?

+0

讀出來,從'va_list的listPointer'在功能'functionA',和值傳遞他們'functionB'然後。或者是由於某種原因沒有打算? –

+0

@StephanLechner是的,根據邏輯,我的函數A也可能調用具有不同參數類型的其他函數...這就是爲什麼顯式提取參數不會工作的原因......我將這個添加到我的問題中 –

+0

[在C中轉發可變參數的調用]的可能副本(http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c) – Lanting

回答

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); 
} 
+0

謝謝你的建議,但它不適用於我的情況,因爲我有一個功能C,它也需要不同的參數... –

+0

@AksimElnik爲FunctionC調用添加額外代碼 –

2

如果你不能改變你的functionB,那麼你必須從你的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); 
} 

也許有複製的泛函參數的存儲和調用functionB方式/函數與一個指針呢?有沒有人有一個如何可能的想法?

那麼就意味着你必須改變你的聲明functionBfunctionC等你不如再改他們接受va_list代替:

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

謝謝您的建議,但它贏了不適用於我的情況,因爲我有一個函數C,它也會採用不同的參數... –

1

不能更改簽名B,但是你能改變A嗎? 如果是這樣,這可能是一個不錯的選擇:

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

是否只保證'functionA' 的第二個到第四個參數傳遞給'functionB'? –

+0

@StephanLechner我認爲這是隱含的問題,調用者會傳遞正確的數量和類型的參數爲選定的功能。否則無論如何不可能回答 –

+0

在這種情況下沒有。但是,如果簽名更改爲「int functionA(int a,Args && ... args)''那麼是的。然而參數''a''可以省略,因爲我猜它只用於OP版本來確定提供了多少個可變參數。在這種情況下,可以使用''size_t v = sizeof(args ...)'' –