在Qt中有这样的功能:QMetaObject::invokeMethod(QObject * obj, const char * member, ...)
,它从字符串(成员)调用方法。我怎么能这样做(或类似)?感谢)
答案 0 :(得分:4)
你不能在纯c ++中做到这一点,但你可以在this问题
中阅读c ++中的反思/内省答案 1 :(得分:4)
使用map<std::string, std::function<void()>>
:
std::map<std::string, std::function<void()>> funs;
funs["hello world"] = [] () { std::cout << "hello world"; };
funs["hello world"]();
问题是你想要它有多相似? 这个电话应该如何“原生”?。你可以这样做:
void foobar(int, float);
...
invoke("foobar", 5, 5.f);
但实施看起来很糟糕,并且非常重要。
你可以使用可变参数模板和一些模板/虚拟技术。使用以下代码,您将能够执行以下操作:
std::string select_string (bool cond, std::string a, std::string b) {
return cond ? a : b;
}
int main () {
Registry reg;
reg.set ("select_it", select_string);
reg.invoke ("select_it", "1 John Wayne"));
reg.invoke ("select_it", "0 John Wayne"));
}
即。其中参数列表被解析为本机函数调用的真实参数列表。使用可变参数模板,您可以做很多事情;我不确定你应该。