1

Qt 中有这样的功能:QMetaObject::invokeMethod(QObject * obj, const char * member, ...),它从字符串(成员)调用方法。我怎么能做同样的(或类似的)?谢谢)

4

2 回答 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 回答