【发布时间】:2019-08-12 18:13:23
【问题描述】:
我有一个服务器类,它处理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 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++ 专业人士,所以我的问题是这是否是正确的方法。
【问题讨论】:
标签: c++ qt function-pointers qhash