インタプリタに「組み込まれている」関数を使用するスクリプト言語をC++で開発しています。次の構造を使用して、関数名をそれぞれのポインターにマップしています。
typedef void(*BuiltInFunction)(Context*);
typedef std::unordered_map<std::string, BuiltInFunction> BuiltinFunctionsMap;
ここContext
で、はカスタムクラスです。
次に、次のような関数宣言があります。
namespace BuiltIns {
void _f_print(Context* context);
void _f_error(Context* context);
void _f_readline(Context* context);
void _f_read(Context* context);
void _f_readchar(Context* context);
void _f_eof(Context* context);
...
}
そして最後に、マップを実際のポインターで埋めるルーチン:
BuiltinFunctionsMap BuiltIns::populateFunctions() {
BuiltinFunctionsMap funcMap;
// Standard I/0
funcMap["print"] = &BuiltIns::_f_print;
funcMap["error"] = &BuiltIns::_f_error;
funcMap["readline"] = &BuiltIns::_f_readline;
funcMap["read"] = &BuiltIns::_f_read;
funcMap["readchar"] = &BuiltIns::_f_readchar;
funcMap["eof"] = &BuiltIns::_f_eof;
...
return funcMap;
}
私が求めているのは、テンプレートなどを使用して、関数宣言から自動的に母集団関数を生成する方法があるかどうかです。現在、私は正規表現を使用しています。これは十分に単純ですが、新しい関数を追加するたびにそれを実行する必要があり、面倒です。