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
或任何其他非标准哈希表肯定会提供类似的功能


感谢您确认这样做是可以的:-)对于不完整的示例,很抱歉,我将编辑代码以避免未定义的行为。