私は関数A(...)
とB(...)
を持っています。今度はB
をA
の中に呼び出す必要があります。...
をA
からB
に渡す方法はありますか?擬似コード:va_argsをC++で処理する
void A(...)
{
// Some operators
B(...); // Instead of ... I need to pass A's args
}
p.s.私はこれがマクロを使って行うことができることを知っていますが、機能については何か。
私は関数A(...)
とB(...)
を持っています。今度はB
をA
の中に呼び出す必要があります。...
をA
からB
に渡す方法はありますか?擬似コード:va_argsをC++で処理する
void A(...)
{
// Some operators
B(...); // Instead of ... I need to pass A's args
}
p.s.私はこれがマクロを使って行うことができることを知っていますが、機能については何か。
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を使用している場合、あなたは完璧な転送と可変引数テンプレートでこれを行うことができます
残念ながら、va-list
を受け取り、可変引数リストを受け入れる関数に渡すことはできません。 va_args構造体をパラメータに戻すための構文はありません。
va_list
として1つのパラメータに渡すことができるため、作業を行う機能をva_list
と定義することが1つの解決策になります。次に、別の関数を定義して引数リストをラップし、va_list
をコア関数に渡して戻り値を返すことができます。この種のパターンは、C標準ライブラリでprintf()
となどのペアで表示されます。
メソッドのシグネチャを少し変更する必要があります。私はこのようなことをしたいと思っています:
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);
}