оператор switch / case в C ++ с типом QString

Первичный ключ не должен быть столбцом идентификационных данных.

у Вас не может быть двух столбцов Identity.

Вы могли получить что-то близко к тому, что Вы хотите с триггером...

26
задан phuclv 19 March 2019 в 13:33
поделиться

5 ответов

case "the":
    //^^^ case label must lead to a constant expression

Я не знаю о qt , но вы можете попробовать. Вы можете избежать switch и напрямую использовать == для сравнения, если QString ничем не отличается от нормального std::string.

if( word == "the" )
{
   // ..
}
else if( word == "at" )
{
   // ..
}
// ....
0
ответ дан 28 November 2019 в 06:44
поделиться

Проверьте это, это помогает мне

int main(int, char **)
{
    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;
}
-2
ответ дан 28 November 2019 в 06:44
поделиться

Как отмечалось ранее, это не проблема Qt, операторы switch могут использовать только константные выражения, посмотрите на классы коллекций a QSet - хорошее решение

void initStopQwords(QSet<QString>& stopSet)
{
    // Ideally you want to read these from a file
    stopSet << "the";
    stopSet << "at";
    ...

}

bool isStopWord(const QSet<QString>& stopSet, const QString& word)
{
    return stopSet.contains(word);
}
1
ответ дан 28 November 2019 в 06:44
поделиться

Если вы можете использовать современный компилятор C ++, вы можете вычислить значение хеша времени компиляции для ваших строк. В этот ответ приведен пример довольно простой constexpr хеширующей функции.

Таким образом, решение может выглядеть так:

// function from https://stackoverflow.com/a/2112111/1150303
// (or use some other constexpr hash functions from this thread)
unsigned constexpr const_hash(char const *input) {
    return *input ?
    static_cast<unsigned int>(*input) + 33 * const_hash(input + 1) :
    5381;
}

QString switchStr = "...";
switch(const_hash(switchStr.toStdString().c_str()))
{
case const_hash("Test"):
    qDebug() << "Test triggered";
    break;
case const_hash("asdf"):
    qDebug() << "asdf triggered";
    break;
default:
    qDebug() << "nothing found";
    break;
}

Это все еще не идеальное решение. Могут быть коллизии хешей (следовательно, тестируйте вашу программу всякий раз, когда вы добавляете / изменяете case), и вы должны быть осторожны при преобразовании из QString в char*, если вы хотите использовать, например, экзотические или utf символы .

Для c ++ 11 добавьте CONFIG += c++11 в свой проект, для Qt5. Qt4: QMAKE_CXXFLAGS += -std=c++11

3
ответ дан 28 November 2019 в 06:44
поделиться

Вы можете, создав QStringList перед итерацией, например:

QStringList myOptions;
myOptions << "goLogin" << "goAway" << "goRegister";

/*
goLogin = 0
goAway = 1
goRegister = 2
*/

Затем:

switch(myOptions.indexOf("goRegister")){
  case 0:
    // go to login...
    break;

  case 1:
    // go away...
    break;

  case 2:
    //Go to Register...
    break;

  default:
    ...
    break;
}
25
ответ дан 28 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: