2016-12-19 14 views
1

異なる数の引数(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)など)と、ユーザー(解釈クラスを使用するプログラマー)が解釈クラスに渡したカスタム関数となるため、この関数はベクトルになりません。

ありがとうございました。

+0

C++には、このような言語機能はありません。 –

+0

あなたは関数が単一の2倍の代わりに 'ベクトル'をパラメータとして取らないようにしますか? – user463035818

答えて

3

これは実際には可能ですが、私は全く同じ問題を抱えていました。以下を見てください:

Generic template for calling function with vector elements

+0

@kaolo:このヒントをありがとう。私はこれを試してみる。 – Armin

+0

@Armin:ところで、これをJSONとWAMP v1プロトコルを使用したリモートプロシージャコール機能に拡張しました:https://github.com/koalo/wamp_cpp/blob/master/wamp_cpp/RPCallable.h – koalo

関連する問題