我有一个服务器类,它处理 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
}
等等。现在,与此同时,我有很多 Action ,对于每一个 Action ,我的服务器都必须检查所有情况,直到找到正确的 Action 。因此,我想知道是否有更好的方法来做到这一点。
我考虑过在不同的函数中进行数据处理,并有一个 QHash
,其中包含指向每个操作的相应函数的相应函数指针,如下所示:
在构造函数中:
const QHash<QString, void(Server::*)(const QJsonObject &)> processFunctionsMap {
{ SOME_ACTION, &Server::processSomeAction },
{ SOME_OTHER_ACTION, &Server::processSomeOtherAction }
}
以及各自的功能:
void Server::processSomeAction(const QJsonObject &data)
{
...
}
然后调用匹配函数:
if (! processFunctionsMap.contains(action)) {
// Catch this case
}
(this->*processFunctionsMap.value(action))(jsonObject);
这似乎可行,但我不是 C++ 专家,所以我的问题是这是否是正确的方法。
最佳答案
您的方法是合理的,但您已将不匹配场景从执行 else
block (可能什么都不做)更改为即时未定义行为。
您需要将哈希查找与调用分开,以便您可以在两者之间插入对成功查找的检查。对于 C++ 标准集合(std::map
是一个红黑树,std::unordered_map
是一个哈希表),这就是对 find(key)
返回一个迭代器...你将它与 map.end()
进行比较,如果它们相等,请确保不要取消引用。 QHash
或任何其他非标准哈希表肯定会提供类似的东西。
关于c++ - 通过带有成员函数指针的 QHash 调用成员函数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57466208/