Невозможно напрямую переключаться на строки в C ++.Однако это возможно в Qt, используя QMetaEnum
, как показано здесь: Q_ENUM
и как включить строку
Для этого сначала объявитеenum со строками для использования в случаях переключения в качестве имени перечислителя в объявлении вашего класса.Затем добавьте перечисление к метаданным с помощью Q_ENUMS
, чтобы программа могла выполнить поиск позже.
#include <QMetaEnum>
class TestCase : public QObject
{
Q_OBJECT
Q_ENUMS(Cases) // metadata declaration
public:
explicit Test(QObject *parent = 0);
enum Cases
{
THE, AT, IN, THIS // ... ==> strings to search, case sensitive
};
public slots:
void SwitchString(QString word);
};
Затем в файле .cpp
установите нужный переключатель после преобразования строки в соответствующее значение с помощью .
Сравнение чувствительно к регистру, поэтому, если вы хотите выполнить поиск без учета регистра, сначала преобразуйте входную строку в верхний / нижний регистр.Вы также можете сделать другие преобразования, необходимые для строки.Например, если вам нужно переключать строки с пробелами или недопустимыми символами в идентификаторах C / C ++, вы можете преобразовать / удалить / заменить эти символы, чтобы сделать строку допустимым идентификатором.
void TestCase::SwitchString(QString word)
{
// get information about the enum named "Cases"
QMetaObject MetaObject = this->staticMetaObject;
QMetaEnum MetaEnum = MetaObject.enumerator(MetaObject.indexOfEnumerator("Cases"));
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");