【问题标题】:C++ invoke method from string [closed]C++从字符串调用方法[关闭]
【发布时间】:2013-01-15 01:16:19
【问题描述】:

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

【问题讨论】:

  • 如果你真的需要这个问题,你应该问自己这个问题。
  • 你看QtMetaObject源代码了吗?!就是这样(...之一)

标签: c++ qt


【解决方案1】:

您不能在纯 c++ 中执行此操作,但您可以在 this question 中阅读有关 c++ 中的反射/内省

【讨论】:

  • 谢谢!这真的很有用)
  • @CAMOBAP:当然,您可以根据string 调用方法。最简单的例子是map<std::string, std::function<void()>>。您甚至可以对可变长的参数列表执行此操作,包括调用签名正确性的运行时检查(但它有点难看)。
  • 实际上我觉得有必要投反对票,因为用简单的“你不能”来回答如此广泛的问题是错误的,而且根本不是真的。
【解决方案2】:

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);

但实现看起来很老套,而且并不简单。

a related problem

您可以通过可变参数模板和一些模板/虚拟技术走得更远。使用以下代码,您将能够执行以下操作:

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"));
}

即其中参数列表被分解为本地函数调用的真实参数列表。使用可变参数模板,您可以做很多事情;我不确定你是否应该

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多