如何按组打印连续枚举值?C++枚举遍历问题
解决方案
1. 构建反向映射
原_map仅支持通过字符串键查询枚举值,我们需要一个从枚举值到字符串的反向映射,用来快速判断枚举值是否存在并获取对应的名称。由于不能修改原_map,可在程序初始化阶段生成这个反向映射:
// 全局反向映射,与原_map同生命周期 std::unordered_map<Values, std::string> reverse_map; // 初始化反向映射(建议在main函数开头调用) void init_reverse_map() { for (const auto& entry : _map) { reverse_map[entry.second] = entry.first; } }
2. 修改foo函数逻辑
调整循环逻辑,加入枚举值存在性检查、分组判断,同时输出枚举名称而非数值:
void foo(Values base) { uint32_t mask = static_cast<uint32_t>(base) & 0xFFFF0000; uint32_t current_val = static_cast<uint32_t>(base); while (true) { Values current_enum = static_cast<Values>(current_val); // 超出枚举最大值则终止 if (current_enum >= Values::MAX) { break; } // 进入不同分组则终止 uint32_t cur_mask = current_val & 0xFFFF0000; if (cur_mask != mask) { break; } // 当前枚举值不存在则终止 auto it = reverse_map.find(current_enum); if (it == reverse_map.end()) { break; } // 打印枚举名称 std::cout << it->second << "\n"; // 遍历下一个连续数值 current_val++; } }
3. 调用效果
先调用init_reverse_map()完成初始化后,执行预期调用:
foo(Values::one)输出:one oneOne oneTwofoo(Values::oneOne)输出:oneOne oneTwofoo(Values::twoTwo)输出:twoTwo
核心说明
- 反向映射仅需初始化一次,完全不影响原
_map的原有用途 - 循环终止条件覆盖三类场景:超出枚举范围、跨分组、枚举值不存在,完全匹配需求
- 直接输出枚举的字符串名称,符合预期格式
内容的提问来源于stack exchange,提问作者xyf
相关产品推荐
相关产品推荐

