関数を自動的に生成しようとしています。たとえば、foo1 から foo50 までの名前の 50 個の関数を、それぞれを定義せずに作成できますか?
これをドメイン固有言語のインタープリターに使用しています。現在、次の一般式に従う約 80 の関数があります。
pqlsymbol * u_greedy_consen(vector<pqlsymbol * > arglist)
{
pqlsymbol * result;
if (arglist.size() == 1 && arglist[0]->is_treeset()){
result = new pqlsymbol(greedy_consen(arglist[0]->get_treeset(), 100 ) );
}
else if (arglist.size() == 2 && arglist[0]->is_treeset() && arglist[1]->is_double()){
result = new pqlsymbol(greedy_consen(arglist[0]->get_treeset(), (float)(arglist[1]->get_double()) ) );
}
else if (arglist.size() == 2 && arglist[0]->is_treeset() && arglist[1]->is_int()){
result = new pqlsymbol(greedy_consen(arglist[0]->get_treeset(), (float)(arglist[1]->get_int()) ) );
}
else {
//cout << "consensus expects 1 treeset and optinally 1 Int/Double argument. " << "Found " << get_arg_types(arglist) << endl;
result = new pqlsymbol(ERROR, "Type Error");
}
return result;
}
arglist は、コマンド ラインで渡される引数のリストです。arglist のサイズをチェックし、引数の型が正しいかどうかをチェックし、正しい型であれば適切な関数を呼び出します。
したがって、これをより一般的な関数に減らすことができるかどうかを知りたいです。予想される引数の型のベクトルを指定し、それらの引数が見つかった場合に呼び出される関数へのポインターを指定します。
それで、次のような電話をかける方法はありますか:
add_function("greedy_consen", [[ツリーセット], [ツリーセット, int], [ツリーセット, ダブル] ], &greedy_consen)
これにより、指定されたパラメーターのセットのいずれかを自動的に検索し、見つかった場合はそれらのパラメーターで greedy_consen を呼び出す関数 u_greedy_consen が作成されます。それは可能ですか?
ありがとう