为什么开关语句不能应用于字符串?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)
int main()
{
    switch(std::string("raj")) //Compilation error - switch expression of type illegal 
    {
    case"sda":
    }

}
提问于
用户回答回答于

原因与类型系统有关。C / C ++并不真正支持字符串作为一种类型。它确实支持一个常量字符数组的概念,但它并不完全理解字符串的概念。

为了生成switch语句的代码,编译器必须理解两个值相等意味着什么。对于像int和枚举这样的项目,这是一个微不足道的比较。但编译器应如何比较2个字符串值?区分大小写,不敏感,文化意识等......如果没有对字符串的完整意识,就无法准确回答。

另外,C / C ++开关语句通常生成为分支表。为字符串样式开关生成分支表并不容易。

用户回答回答于

正如前面提到的,编译器喜欢构建查找表,switch尽可能地将语句优化为接近O(1)的时间。将此与C ++语言没有字符串类型的事实相结合 - std::string是标准库的一部分,它不属于语言本身的一部分。

我会提供一个你可能要考虑的替代方案,过去我已经使用它来取得良好效果。而不是切换字符串本身,切换使用该字符串作为输入的散列函数的结果。如果你使用预定义的字符串,你的代码几乎与切换字符串一样清晰:

enum string_code {
    eFred,
    eBarney,
    eWilma,
    eBetty,
    ...
};

string_code hashit (std::string const& inString) {
    if (inString == "Fred") return eFred;
    if (inString == "Barney") return eBarney;
    ...
}

void foo() {
    switch (hashit(stringValue)) {
    case eFred:
        ...
    case eBarney:
        ...
    }
}

扫码关注云+社区