首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >QString类型的C++中的switch/case语句

QString类型的C++中的switch/case语句
EN

Stack Overflow用户
提问于 2011-03-28 04:29:30
回答 10查看 84.3K关注 0票数 32

我想在我的程序中使用switch-case,但是编译器给了我这个错误:

代码语言:javascript
代码运行次数:0
运行
复制
switch expression of type 'QString' is illegal

如何在QString中使用switch语句

我的代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
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 ;
}
EN

回答 10

Stack Overflow用户

发布于 2012-07-01 10:35:09

您可以在迭代之前创建一个QStringList,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
QStringList myOptions;
myOptions << "goLogin" << "goAway" << "goRegister";

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

然后:

代码语言:javascript
代码运行次数:0
运行
复制
switch(myOptions.indexOf("goRegister")){
  case 0:
    // go to login...
    break;

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

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

  default:
    ...
    break;
}
票数 32
EN

Stack Overflow用户

发布于 2018-11-10 02:34:47

@DomTomCat的回答已经触及了这一点,但由于问题是专门询问Qt的,所以有一个更好的方法。

Qt已经有了一个用于常量的散列函数,但不幸的是,qt4的qHash没有被限定为常量。幸运的是,Qt是开源的,所以我们可以将QStrings的qHash功能复制到我们自己的constexpr散列函数中并使用它!

Qt4's qHash source

我已经修改了它,只需要一个参数(字符串文字总是以null结尾):

代码语言:javascript
代码运行次数:0
运行
复制
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语句中使用它,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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。

票数 5
EN

Stack Overflow用户

发布于 2017-03-05 19:21:06

如果您可以使用现代的C++编译器,那么您就可以为您的字符串计算一个编译时哈希值。在this answer中,有一个相当简单的constexpr散列函数的示例。

因此,解决方案可能如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
// 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*字符,那么在从QStringutf的转换中必须小心。

对于c++ 11,将CONFIG += c++11添加到您的项目中;对于Qt5,将其添加到项目中。Qt4:QMAKE_CXXFLAGS += -std=c++11

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5452188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档