在 C++ 中不能直接打开字符串。但是,在 Qt 中可以使用QMetaEnum
如下所示:Q_ENUM
以及如何打开字符串。您甚至不需要像 Anthony Hilyard 的回答那样的 C++14,并且匹配的情况不是字符串的哈希,因此哈希冲突的可能性为零
基本上QMetaEnum
可以从字符串转换为枚举值,反之亦然,所以我们将使用它跳转到正确的分支。一个小的限制是字符串是枚举值,因此字符串必须是有效的 C++ 标识符。但这很容易解决,如有必要,只需将特殊字符替换为特定规则即可
为此,首先在类声明中声明一个枚举,其中包含要在 switch case 中使用的字符串作为枚举器名称。然后将枚举添加到元数据Q_ENUMS
中,以便程序稍后搜索。
#include <QMetaEnum>
class TestCase : public QObject
{
Q_OBJECT
Q_ENUMS(Cases) // metadata declaration
QMetaObject MetaObject;
QMetaEnum MetaEnum; // enum metadata
TestCase() :
// get information about the enum named "Cases"
MetaObject(this->staticMetaObject),
MetaEnum(MetaObject.enumerator(MetaObject.indexOfEnumerator("Cases"))
{}
public:
explicit Test(QObject *parent = 0);
enum Cases
{
THE, AT, IN, THIS // ... ==> strings to search, case sensitive
};
public slots:
void SwitchString(const QString &word);
};
SwitchString
然后在将字符串转换为相应的值后,只需在内部实现所需的开关QMetaEnum::keyToValue
。
比较区分大小写,因此如果您想要不区分大小写的搜索,请先将输入字符串转换为大写/小写。您还可以对字符串进行其他必要的转换。例如,如果您需要在 C++ 标识符中使用空格或禁止字符切换字符串,您可以转换/删除/替换这些字符以使字符串成为有效标识符。
void TestCase::SwitchString(const QString &word)
{
switch (MetaEnum.keyToValue(word.toUpper().toLatin1()))
// or simply switch (MetaEnum.keyToValue(word)) if no string modification is needed
{
case THE: /* do something */ break;
case AT: /* do something */ break;
case IN: /* do something */ break;
case THIS: /* do something */ break;
default: /* do something */ break;
}
}
然后只需使用该类来切换字符串。例如:
TestCase test;
test.SwitchString("At");
test.SwitchString("the");
test.SwitchString("aBCdxx");