Qt 中有这样的功能:QMetaObject::invokeMethod(QObject * obj, const char * member, ...)
,它从字符串(成员)调用方法。我怎么能做同样的(或类似的)?谢谢)
问问题
1389 次
2 回答
4
您不能在纯 C++ 中执行此操作,但您可以在此问题中阅读有关 C++ 中的反射/内省的信息
于 2013-01-14T16:02:06.633 回答
4
类似的事情可以通过 a 来实现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);
但是实现看起来很hacky并且不平凡。
有一个相关的问题:
您可以使用可变参数模板和一些模板/虚拟技术走得很远。使用以下代码,您将能够执行以下操作:
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"));
}
即,参数列表被分解为本地函数调用的真实参数列表。使用可变参数模板,您可以做很多事情;我不确定您是否应该这样做。
于 2013-01-14T17:08:22.507 回答