Первичный ключ не должен быть столбцом идентификационных данных.
у Вас не может быть двух столбцов Identity.
Вы могли получить что-то близко к тому, что Вы хотите с триггером...
case "the":
//^^^ case label must lead to a constant expression
Я не знаю о qt , но вы можете попробовать. Вы можете избежать switch
и напрямую использовать ==
для сравнения, если QString
ничем не отличается от нормального std::string
.
if( word == "the" )
{
// ..
}
else if( word == "at" )
{
// ..
}
// ....
Проверьте это, это помогает мне
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;
}
Как отмечалось ранее, это не проблема 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);
}
Если вы можете использовать современный компилятор 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
Вы можете, создав 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;
}