如何将字符串向量转换为成员名同名的C++ enum class枚举类?
解决思路
首先明确核心限制:C++的enum class是编译期实体,而std::vector<std::string>是运行期容器,无法直接在代码中将运行期的向量转换为编译期的枚举类,需根据字符串内容的确定时机分两种场景处理:
场景1:字符串内容编译期已知
这种情况可以通过「单一数据源维护+自动生成代码」的方式实现,避免重复编写内容:
方法1:预处理器宏同步生成
通过宏定义维护水果列表,分别展开生成枚举类和字符串向量,确保两者内容一致:
// 定义唯一的水果列表宏 #define FRUIT_ENTRIES \ X(Apple) \ X(Banana) \ X(Orange) // 生成enum class enum class fruitID : uint32_t { #define X(name) name, FRUIT_ENTRIES #undef X _size }; // 生成对应的字符串向量 std::vector<std::string> fruit = { #define X(name) #name, FRUIT_ENTRIES #undef X };
方法2:代码生成脚本
用Python/Shell等脚本读取固定的字符串列表,自动生成枚举类的头文件。比如Python脚本示例:
# 维护水果列表 fruits = ["Apple", "Banana", "Orange"] # 生成枚举类代码 with open("fruit_enum.h", "w") as f: f.write("enum class fruitID : uint32_t {\n") for idx, item in enumerate(fruits): f.write(f" {item} = {idx},\n") f.write(f"\n _size = {len(fruits)}\n}};\n")
运行脚本后直接在项目中引入生成的fruit_enum.h即可。
场景2:字符串内容运行期动态获取
此时无法创建真正的enum class(枚举类型必须编译期确定),可以用类模拟枚举的类型安全和映射功能:
#include <unordered_map> #include <vector> #include <string> class FruitID { public: // 模拟枚举常量 static const uint32_t Apple = 0; static const uint32_t Banana = 1; static const uint32_t Orange = 2; static const uint32_t _size = 3; // 字符串与ID的双向映射(支持运行期初始化) static std::unordered_map<std::string, uint32_t> str_to_id; static std::vector<std::string> id_to_str; }; // 初始化映射表 std::unordered_map<std::string, uint32_t> FruitID::str_to_id = { {"Apple", FruitID::Apple}, {"Banana", FruitID::Banana}, {"Orange", FruitID::Orange} }; std::vector<std::string> FruitID::id_to_str = { "Apple", "Banana", "Orange" };
如果字符串向量是动态加载的,也可以在运行期通过遍历向量填充str_to_id和id_to_str。
内容的提问来源于stack exchange,提问作者Bugra
相关产品推荐
相关产品推荐

