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

新手上路,请多包涵

编译以下代码会给出错误消息: type illegal

 int main()
{
    // Compilation error - switch expression of type illegal
    switch(std::string("raj"))
    {
    case"sda":
    }
}

您不能在 switchcase 中使用字符串。为什么?是否有任何解决方案可以很好地支持类似于打开字符串的逻辑?

原文由 yesraaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

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

为了生成 switch 语句的代码,编译器必须理解两个值相等的含义。对于整数和枚举之类的项目,这是一个微不足道的比较。但是编译器应该如何比较两个字符串值呢?区分大小写、不区分大小写、文化意识等……如果不完全了解字符串,就无法准确回答。

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

原文由 JaredPar 发布,翻译遵循 CC BY-SA 2.5 许可协议

野兔对尼克的解决方案的评论真的很酷。这里是完整的代码示例(在 C++11 中):

 constexpr uint32_t hash(const std::string& s) noexcept
{
    uint32_t hash = 5381;
    for (const auto& c : s)
        hash = ((hash << 5) + hash) + (unsigned char)c;
    return hash;
}

constexpr inline uint32_t operator"" _(char const* p, size_t) { return hash(p); }

std::string s = "raj";
switch (hash(s)) {
case "sda"_:
    // do_something();
    break;
default:
    break;
}

原文由 marco 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题