我正在C++中開發一個腳本語言,它使用解釋器中「內置」功能。我使用下面的施工函數名稱映射到它們各自的指針:帶功能指針的std :: map自動填充
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;
}
我所問的是,如果有辦法使用模板或類似的東西從函數聲明中自動生成填充函數。目前,我使用的正則表達式很簡單,但每當添加新的函數時都必須這樣做,而且很麻煩。
我對C++相當陌生。我會很樂意考慮更好的解決方案:) – Tibor 2012-04-09 15:22:21
'std :: function'是你的朋友。它可以是一個函數指針或函數對象,這意味着它可以是很多很多的東西。函數指針是非常嚴格的,而'std :: function'允許很多自由度。 – Puppy 2012-04-09 15:33:37
如果你可以用正則表達式來做到這一點,你不能把它作爲構建過程中的一個步驟嗎? – alexisdm 2012-04-09 15:35:41