在C++中,不能直接使用字符串进行开关操作。但是,在Qt中可以使用
QMetaEnum
实现,如此示例所示:
Q_ENUM
and how to switch on a string。甚至不需要像Anthony Hilyard的答案中那样使用C++14,并且匹配的情况
不是字符串的哈希值,因此零碰撞的机会。
基本上,QMetaEnum
可以将字符串转换为枚举值,反之亦然,因此我们将使用它来跳转到正确的分支。一个小限制是字符串是枚举值,因此字符串必须是有效的C ++标识符。但这很容易解决,只需根据需要使用特定规则替换特殊字符即可。
为此,首先在类声明中声明枚举,并将要用作开关情况的字符串作为枚举器名称。然后使用Q_ENUMS
将枚举添加到元数据中,以便程序稍后搜索。
#include <QMetaEnum>
class TestCase : public QObject
{
Q_OBJECT
Q_ENUMS(Cases)
QMetaObject MetaObject;
QMetaEnum MetaEnum;
TestCase() :
MetaObject(this->staticMetaObject),
MetaEnum(MetaObject.enumerator(MetaObject.indexOfEnumerator("Cases"))
{}
public:
explicit Test(QObject *parent = 0);
enum Cases
{
THE, AT, IN, THIS
};
public slots:
void SwitchString(const QString &word);
};
然后,在使用QMetaEnum::keyToValue
将字符串转换为相应的值之后,只需在SwitchString
内部实现所需的开关即可。
比较区分大小写,因此如果您想要进行不区分大小写的搜索,请先将输入字符串转换为大/小写。您还可以进行其他必要的字符串转换。例如,如果您需要在C++标识符中切换带有空格或禁止字符的字符串,则可以将这些字符转换/删除/替换,使该字符串成为有效的标识符。
void TestCase::SwitchString(const QString &word)
{
switch (MetaEnum.keyToValue(word.toUpper().toLatin1()))
{
case THE: break;
case AT: break;
case IN: break;
case THIS: break;
default: break;
}
}
然后只需要使用类来切换字符串。例如:
TestCase test;
test.SwitchString("At");
test.SwitchString("the");
test.SwitchString("aBCdxx");
switch
语句就像任何C++中的switch
语句一样。您需要发布展示您遇到问题的代码。 - Håvard S