c++ - 通过带有成员函数指针的 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 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/

相关文章:

c++ - Qt MainWindow 不显示 MenuBar

qt - 将qt移植到另一个操作系统就这么简单吗?

c++ - QT是否支持运行时动态UI生成和HTML渲染

c++ - 我可以使用 lambda 函数或 std::function 对象代替函数指针吗?

c - 将函数传递给结构数组内的指针

c++ - 如何读取一个txt文件并用C++将它放在一个数组中?

c++ - 在 Objective-C++ 中使用 C++ 类

C++ 转换运算符重载、枚举、整数和字符

c++ - 如何使用 auto 关键字在 C++11 中返回任意类型?

c - 等效的紧凑型 "Switch Case"语句