通过带有成员函数指针的 QHash 调用成员函数的正确方法
Correct way to call a member function via a QHash with member function pointers
我有一个服务器类,它处理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++专业人士,所以我的问题是这是否是正确的方法。
您的方法是合理的,但您已将无匹配场景从执行else
块(可能根本不执行任何操作(更改为即时未定义行为。
您需要将哈希查找与调用分开,以便可以在两者之间插入检查以成功查找。 对于C++标准集合(std::map
是一棵红黑树,std::unordered_map
是一个哈希表(,这将是对返回迭代器的find(key)
的调用......您将它与map.end()
进行比较,并确保如果它们相等,则不要取消引用。QHash
,或任何其他非标准哈希表,肯定会提供类似的东西。
- 了解 QHash 在找不到密钥时会执行的操作
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针