異なる数の引数(1つ以上のdouble値)を取る関数があります。これらの関数へのポインタは、式インタープリタ内のベクトルに格納され、必要に応じて実行時に関数を呼び出すために使用されます。呼び出す関数と渡す引数の数は、式自体に依存し、実行時にのみ認識されます。C++可変数の引数を関数に渡す
式を解釈すると、呼び出す関数を指すイテレータと、渡す引数を持つvector<double>
が得られます。現在のバージョンでは、私は次のようにコードの重複により可変個の引数を渡す必要が解決する:
// (the number of args in dblVec to match the number of args the function accepts is checked previously)
if (dblVec.size() == 1) result = (*funcIter)->function(dblVec.at(0));
else if (dblVec.size() == 2) result = (*funcIter)->function(dblVec.at(0), dblVec.at(1));
else if (dblVec.size() == 3) result = (*funcIter)->function(dblVec.at(0), dblVec.at(1), dblVec.at(2));
...
これは非常にエレガントではないとの制限がありますが、引数の数が数より大きくない場合、それは動作します上記のテスト。私の質問は次のとおりです。
は、呼び出す関数の引数リストの中に「暗黙の」ループを持っているいくつかの方法は、(擬似コード)のように、あり
result = (*funcIter)->function(passVectorContentsAsMultipleSeparatedDoubles(dblVec));
全体を渡すためのソリューションではありません(sin(double)
,cos(double)
、atan2(double, double)
など)と、ユーザー(解釈クラスを使用するプログラマー)が解釈クラスに渡したカスタム関数となるため、この関数はベクトルになりません。
ありがとうございました。
C++には、このような言語機能はありません。 –
あなたは関数が単一の2倍の代わりに 'ベクトル'をパラメータとして取らないようにしますか? –
user463035818