You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按组打印连续枚举值?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
    oneTwo
    
  • foo(Values::oneOne) 输出:
    oneOne
    oneTwo
    
  • foo(Values::twoTwo) 输出:
    twoTwo
    

核心说明

  • 反向映射仅需初始化一次,完全不影响原_map的原有用途
  • 循环终止条件覆盖三类场景:超出枚举范围、跨分组、枚举值不存在,完全匹配需求
  • 直接输出枚举的字符串名称,符合预期格式

内容的提问来源于stack exchange,提问作者xyf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:48:13