C++では文字列を直接切り替えることはできません。ただし、Qtでは、次のように使用することができQMetaEnum
ます。Q_ENUM
文字列をオンにする方法。AnthonyHilyardの回答のようにC++14も必要ありません。一致するケースは文字列のハッシュではないため、ハッシュの衝突の可能性はありません。
基本的QMetaEnum
に文字列から列挙値に、またはその逆に変換できるので、それを使用して正しいブランチにジャンプします。小さな制限の1つは、文字列が列挙値であるため、文字列は有効なC++識別子である必要があることです。ただし、これは簡単に回避できます。必要に応じて、特殊文字を特定のルールに置き換えるだけです。
これを行うには、最初に、クラス宣言で列挙型名としてswitchケースで使用される文字列を使用して列挙型を宣言します。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");