C++:如何实现根据字符串匹配枚举名称并输出对应值的函数
字符串转指定枚举值的实现方案
我正在完成一项作业,尝试了各种搜索方式,但只找到“如何将枚举转换为字符串”的相关内容。我有一个字符串
type,其取值只能为"webApp"、"MobileApp"和"DesktopApp",同时定义了如下枚举:enum applicationType { webApp = 5, MobileApp = 10, DesktopApp = 15 };请问如何编写函数判断输入字符串是否对应枚举名称,若是则输出对应的枚举值?给出的函数雏形如下:
applicationType print_enum(string tip) { //若tip为"webApp"则输出5 }
方法一:条件分支判断
针对限定的几个枚举项,直接用if-else分支匹配字符串,逻辑直观易理解:
#include <string> #include <stdexcept> enum applicationType { webApp = 5, MobileApp = 10, DesktopApp = 15 }; applicationType print_enum(std::string tip) { if (tip == "webApp") { return webApp; } else if (tip == "MobileApp") { return MobileApp; } else if (tip == "DesktopApp") { return DesktopApp; } // 处理非法输入,这里抛出异常提示无效类型,也可根据需求返回默认值 throw std::invalid_argument("Invalid application type string"); }
方法二:哈希映射表
如果后续枚举项可能扩展,用std::unordered_map维护字符串与枚举值的映射会更易维护,代码也更简洁:
#include <string> #include <unordered_map> #include <stdexcept> enum applicationType { webApp = 5, MobileApp = 10, DesktopApp = 15 }; applicationType print_enum(std::string tip) { // 静态映射表,仅初始化一次 static const std::unordered_map<std::string, applicationType> type_map = { {"webApp", webApp}, {"MobileApp", MobileApp}, {"DesktopApp", DesktopApp} }; auto iter = type_map.find(tip); if (iter != type_map.end()) { return iter->second; } throw std::invalid_argument("Invalid application type string"); }
注意事项
- 匹配时严格区分大小写,比如输入"webapp"会不匹配枚举名"webApp",如果需要忽略大小写,可以在匹配前将字符串统一转换为小写(或大写)后再判断。
- 如果作业明确输入只会是三个有效值,可省略异常处理逻辑,但实际开发中建议保留错误处理,避免非法输入引发未知问题。
内容的提问来源于stack exchange,提问作者Bl4ck Spyrit
相关产品推荐
相关产品推荐

