2013-09-29 2 views
3

Мне нужно создать эквивалент оператора switch/case для строк в C++ с Qt. Я считаю, что самый простой способ что-то вроде этого (псевдокод)Как написать инструкцию switch для строк в Qt?

enum colours { red, green, blue }; 
QString array[] colour_names = { "red", "green", "blue" }; 
switch (color_names[user_string]) { 
    case red: answer="Chose red"; 
    case green: answer="Chose green"; 
    case blue: answer="Chose blue"; 
    other: answer="Invalid choice"; 
} 

Но это не воспользоваться некоторыми из особенностей Qt. Я читал о QStringList (чтобы найти позицию строки в списке строк) и std: map (см. How to easily map c++ enums to strings, что я не совсем понимаю).

Есть ли лучший способ переключаться на строки?

+0

не хотите использовать перечисление? – headsvk

+1

Вы не можете использовать строки в инструкции switch. Вы не сказали нам, почему вам нужно заявление о swic. Наиболее простым решением для поиска на основе строки является использование карты. В Qt это означало бы использование QMap . – user2672165

+0

Вы должны использовать llvm :: StringSwitch: http://llvm.org/docs/doxygen/html/StringSwitch_8h_source.html –

ответ

3

Единственный способ использования switch() со строками - использовать целочисленный хэш строки. Вам нужно будет прекомпретировать хэши строк, с которыми вы сравниваете. Это подход, применяемый в qmake для чтения файлов проектов визуальной студии, например.

Важные Предостережения:

  1. Если вы заботитесь о хэш столкновений с некоторыми другими строками, то вам нужно сравнить эту строку в случае. Тем не менее, это по-прежнему дешевле, чем сравнение строк (N/2).

  2. qHash был переработан для QT 5 и хэши отличаются от Qt 4.

  3. Не забудьте break заявление внутри коммутатора. Ваш пример кода пропустил это, а также имел бессмысленное значение переключателя!

Ваш код будет выглядеть следующим образом:

#include <cstdio> 
#include <QTextStream> 

int main(int, char **) 
{ 
#if QT_VERSION < QT_VERSION_CHECK(5,0,0) 
    static const uint red_hash = 30900; 
    static const uint green_hash = 7244734; 
    static const uint blue_hash = 431029; 
#else 
    static const uint red_hash = 112785; 
    static const uint green_hash = 98619139; 
    static const uint blue_hash = 3027034; 
#endif 

    QTextStream in(stdin), out(stdout); 
    out << "Enter color: " << flush; 
    const QString color = in.readLine(); 
    out << "Hash=" << qHash(color) << endl; 

    QString answer; 
    switch (qHash(color)) { 
    case red_hash: 
     answer="Chose red"; 
     break; 
    case green_hash: 
     answer="Chose green"; 
     break; 
    case blue_hash: 
     answer="Chose blue"; 
     break; 
    default: 
     answer="Chose something else"; 
     break; 
    } 
    out << answer << endl; 
} 
+0

OK классный ответ. Как вы получили свои хэш-константы? (Вам нужно запустить простую программу один раз, чтобы распечатать их все?) – TSG

+0

Да, вы можете написать небольшую программу, которая выберет их для вас из исходного кода. Возможно, я добавлю это к вопросу позже. –

0

я нашел предложение на другом сайте, чтобы использовать QStringList цветов, используйте IndexOf() в коммутаторе, а затем использовать значение перечисления в заявлении дела

+0

[образец кода] (http://stackoverflow.com/a/11279163/1938163) –

1
QStringList menuitems; 
menuitems << "about" << "history"; 

switch(menuitems.indexOf(QString menuId)){ 
case 0: 
    MBAbout(); 
    break; 
case 1: 
    MBHistory(); 
    break; 
} 
Смежные вопросы