C++中如何便捷插入连续索引的switch case并自动调整后续索引?
解决方案:无需手动调整序号的C++分支实现
首先明确:你想通过case ++i这种动态变量作为case标签的写法不符合C++语法规范——switch的case标签必须是编译期可求值的常量表达式,运行时变量无法作为case条件,直接写会触发编译错误。
下面提供几种符合标准、能实现你需求的方案:
方案1:使用枚举类型自动维护序号
枚举成员默认会按定义顺序自动递增赋值,插入分支时只需在对应位置添加枚举项,无需手动修改后续序号:
#include <string> // 定义枚举,从1开始编号(匹配原id的起始值) enum class TextId { Hello = 1, My, // 直接在这里插入新分支,后续成员自动递加 Name, Is, Marc }; std::string proceed(int id) { switch(static_cast<TextId>(id)) { case TextId::Hello: return "Hello"; case TextId::My: return "my "; case TextId::Name: return "Name"; case TextId::Is: return "is"; case TextId::Marc: return "Marc"; } return ""; // 处理无效id的默认返回 }
方案2:用数组/vector直接映射(最简洁高效)
放弃switch,用容器存储所有字符串,通过id直接索引访问,插入/删除分支只需修改容器元素,完全不用管序号:
#include <string> #include <vector> std::string proceed(int id) { // 静态容器,程序启动时初始化一次 static const std::vector<std::string> textSegments = { "", // 占位,让索引1对应第一个有效字符串 "Hello", "my ", "Name", // 插入新分支直接加在这里 "is", "Marc" }; // 边界检查,避免越界访问 if (id >= 1 && id < static_cast<int>(textSegments.size())) { return textSegments[id]; } return ""; }
这种方式不仅维护成本最低,执行效率也和switch相当,推荐优先使用。
方案3:编译器宏自动生成序号
利用编译器内置的__COUNTER__宏(GCC、Clang、MSVC均支持)自动生成递增序号,省去手动编号的麻烦:
#include <string> // 定义宏自动生成case标签 #define CASE_TEXT(str) case __COUNTER__ + 1: return str; std::string proceed(int id) { switch(id) { CASE_TEXT("Hello") CASE_TEXT("my ") CASE_TEXT("Name") // 插入分支直接加一行宏调用 CASE_TEXT("is") CASE_TEXT("Marc") } return ""; }
注意:__COUNTER__是编译器扩展,不属于标准C++,但在主流编译器中都能正常工作。
内容的提问来源于stack exchange,提问作者user3808217
相关产品推荐
相关产品推荐

