2012-02-17 1 views
6

私は関数A(...)B(...)を持っています。今度はBAの中に呼び出す必要があります。...AからBに渡す方法はありますか?擬似コード:va_argsをC++で処理する

void A(...) 
{ 
    // Some operators 
    B(...); // Instead of ... I need to pass A's args 
} 

p.s.私はこれがマクロを使って行うことができることを知っていますが、機能については何か。

答えて

7

va_argsを転送することはできません。 va_listだけを転送できます。

template <typename... T> 
void A(T&&... args) 
{ 
    B(std::forward<T>(args)...); 
} 
:(。 vprintfのような関数が存在する理由でもある)

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


あなたがC++ 11を使用している場合、あなたは完璧な転送と可変引数テンプレートでこれを行うことができます

2

残念ながら、va-listを受け取り、可変引数リストを受け入れる関数に渡すことはできません。 va_args構造体をパラメータに戻すための構文はありません。

va_listとして1つのパラメータに渡すことができるため、作業を行う機能をva_listと定義することが1つの解決策になります。次に、別の関数を定義して引数リストをラップし、va_listをコア関数に渡して戻り値を返すことができます。この種のパターンは、C標準ライブラリでprintf()と​​などのペアで表示されます。

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