Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从字符串调用方法_C++_Qt - Fatal编程技术网

C++ C++;从字符串调用方法

C++ C++;从字符串调用方法,c++,qt,C++,Qt,Qt中有这样的功能:QMetaObject::invokeMethod(QObject*obj,const char*member,…),它从字符串(member)调用方法。我怎样才能做到同样(或类似)?谢谢, 在纯C++中你不能这样做,但是你可以在C++中读到关于反射/内省的问题, p>你不能在纯C++中这样做,但是你可以在C++中找到关于反射/内省的问题< < /p> 类似的事情可以用 map < /> >: 但是这个实现看起来很粗糙,而且不平凡 有: 使用可变模板和一些模板/虚拟技术,您可

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

在纯C++中你不能这样做,但是你可以在C++中读到关于反射/内省的问题,<> p>你不能在纯C++中这样做,但是你可以在C++中找到关于反射/内省的问题< < /p> 类似的事情可以用<代码> map < /> >:

但是这个实现看起来很粗糙,而且不平凡

有:

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


i、 e.将参数列表分解为本机函数调用的实际参数列表。有了可变模板,你可以做很多事情;我不确定您是否应该。

类似的事情可以通过
地图来实现:

但是这个实现看起来很粗糙,而且不平凡

有:

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


i、 e.将参数列表分解为本机函数调用的实际参数列表。有了可变模板,你可以做很多事情;我不确定你是否应该。

如果你真的需要,你应该问自己这个问题。你看过QtMetaObject源代码了吗?!如果你真的需要,你应该问自己这个问题。你看过QtMetaObject源代码了吗?!这就是(其中一个…)谢谢!这真的很有用)@CAMOBAP:当然你可以根据
字符串调用方法。最简单的例子是
地图
。您甚至可以对可变长的参数列表执行此操作,包括运行时检查调用签名的正确性(但它有点难看)。实际上,我觉得有必要投反对票,因为简单地用“您不能”回答如此广泛的问题是错误的,而且根本不是真的。谢谢!这真的很有用)@CAMOBAP:当然你可以根据
字符串调用方法。最简单的例子是
地图
。您甚至可以对可变长的参数列表执行此操作,包括运行时检查调用签名的正确性(但它有点难看)。实际上,我觉得有必要投反对票,因为简单地用“您不能”回答如此广泛的问题是错误的,而且根本不是真的。
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"));
}