C++ 通过带有成员函数指针的QHash调用成员函数的正确方法
我有一个服务器类,它处理C++ 通过带有成员函数指针的QHash调用成员函数的正确方法,c++,qt,function-pointers,qhash,C++,Qt,Function Pointers,Qhash,我有一个服务器类,它处理QJsonObject数据,并根据数据中的键集进行处理 目前,我使用一个很大的if-then-else语句来决定这样做: const QString action = jsonObject.value(KEY_ACTION).toString(); if (action == SOME_ACTION) { // do something } else if (action == SOME_OTHER_ACTION) { // do something el
QJsonObject
数据,并根据数据中的键集进行处理
目前,我使用一个很大的if-then-else语句来决定这样做:
const QString action = jsonObject.value(KEY_ACTION).toString();
if (action == SOME_ACTION) {
// do something
} else if (action == SOME_OTHER_ACTION) {
// do something else
}
等等。与此同时,我有很多操作,对于每一个操作,我的服务器都必须检查所有案例,直到找到正确的案例。因此,我想知道是否有更好的方法来做到这一点
我考虑在不同的函数中进行数据处理,并使用QHash
,每个操作的相应函数指针如下:
const QString action = jsonObject.value(KEY_ACTION).toString();
if (action == SOME_ACTION) {
// do something
} else if (action == SOME_OTHER_ACTION) {
// do something else
}
在构造函数中:
const QHash<QString, void(Server::*)(const QJsonObject &)> processFunctionsMap {
{ SOME_ACTION, &Server::processSomeAction },
{ SOME_OTHER_ACTION, &Server::processSomeOtherAction }
}
然后调用匹配函数:
if (! processFunctionsMap.contains(action)) {
// Catch this case
}
(this->*processFunctionsMap.value(action))(jsonObject);
<>这似乎有效,但我不是C++的专业人员,所以我的问题是,这是不是正确的方法。 你的方法是合理的,但是你已经改变了不匹配的场景,从执行<代码>其他< /Cux>块(可能根本不做任何事情)到即时未定义的行为。 您需要将散列查找与调用分开,以便在两者之间插入成功查找的检查。使用C++标准集合(<代码> STD:MAP> <代码>,这是一个红黑树,<代码> STD::unOrdEdjPad < /Case>这是一个哈希表),这是对代码>查找(key)< /C> >的调用,它返回迭代器…将其与
map.end()
进行比较,如果它们相等,请确保不取消引用QHash
或任何其他非标准哈希表肯定会提供类似的功能