我想在我的程序中使用switch-case,但是编译器给了我这个错误:
switch expression of type 'QString' is illegal
如何在QString
中使用switch
语句
我的代码如下:
bool isStopWord( QString word )
{
bool flag = false ;
switch( word )
{
case "the":
flag = true ;
break ;
case "at" :
flag = true ;
break ;
case "in" :
flag = true ;
break ;
case "your":
flag = true ;
break ;
case "near":
flag = true ;
break ;
case "all":
flag = true ;
break ;
case "this":
flag = true ;
break ;
}
return flag ;
}
发布于 2012-07-01 10:35:09
您可以在迭代之前创建一个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;
}
发布于 2018-11-10 02:34:47
@DomTomCat的回答已经触及了这一点,但由于问题是专门询问Qt的,所以有一个更好的方法。
Qt已经有了一个用于常量的散列函数,但不幸的是,qt4的qHash没有被限定为常量。幸运的是,Qt是开源的,所以我们可以将QStrings的qHash功能复制到我们自己的constexpr散列函数中并使用它!
我已经修改了它,只需要一个参数(字符串文字总是以null结尾):
uint constexpr qConstHash(const char *string)
{
uint h = 0;
while (*string != 0)
{
h = (h << 4) + *string++;
h ^= (h & 0xf0000000) >> 23;
h &= 0x0fffffff;
}
return h;
}
一旦您定义了它,您就可以在switch语句中使用它,如下所示:
QString string;
// Populate the QString somehow.
switch (qHash(string))
{
case qConstHash("a"):
// Do something.
break;
case qConstHash("b"):
// Do something else.
break;
}
由于此方法使用Qt用于计算散列的相同代码,因此它将具有与QHash相同的抗散列冲突能力,这通常是非常好的。缺点是这需要一个相当新的编译器--因为它在constexpr散列函数中有非返回语句,所以它需要C++14。
发布于 2017-03-05 19:21:06
如果您可以使用现代的C++编译器,那么您就可以为您的字符串计算一个编译时哈希值。在this answer中,有一个相当简单的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
时都要测试您的程序),例如,如果您想要使用外来字符或char*
字符,那么在从QString
到utf
的转换中必须小心。
对于c++ 11,将CONFIG += c++11
添加到您的项目中;对于Qt5,将其添加到项目中。Qt4:QMAKE_CXXFLAGS += -std=c++11
https://stackoverflow.com/questions/5452188
复制相似问题