如何将变量名传入C++枚举以获取对应枚举值?
问题解答
C++中枚举类型和字符串属于完全不同的类型,不存在直接的隐式转换,这就是你遇到cannot convert 'String' to 'getValue'编译错误的原因。你不能直接把String类型的变量赋值给枚举变量,必须手动建立字符串与枚举值的映射关系来实现需求。
下面提供两种可行的实现方案:
方案一:用映射表建立字符串与枚举的对应关系
这种方式适合枚举项较多的场景,维护起来更方便:
#include <map> #include <string> enum getValue { monday = 20, tuesday = 30, wednesday = 40, thursday = 50, friday = 60, saturday = 70, sunday = 80, everyday = 90 }; // 若为Arduino环境,可将std::string替换为Arduino自带的String类型 std::string settingValue(const std::string& settingName) { // 静态映射表,仅初始化一次 static const std::map<std::string, getValue> name_to_enum = { {"monday", monday}, {"tuesday", tuesday}, {"wednesday", wednesday}, {"thursday", thursday}, {"friday", friday}, {"saturday", saturday}, {"sunday", sunday}, {"everyday", everyday} }; auto iter = name_to_enum.find(settingName); if (iter != name_to_enum.end()) { // 将枚举值(整数)转换为字符串返回 return std::to_string(iter->second); } // 处理未匹配到的无效输入 return "invalid setting"; }
方案二:用条件判断逐个匹配
如果枚举项较少,用简单的if-else也能实现需求:
#include <string> enum getValue { monday = 20, tuesday = 30, wednesday = 40, thursday = 50, friday = 60, saturday = 70, sunday = 80, everyday = 90 }; std::string settingValue(const std::string& settingName) { getValue value; if (settingName == "monday") { value = monday; } else if (settingName == "tuesday") { value = tuesday; } else if (settingName == "wednesday") { value = wednesday; } else if (settingName == "thursday") { value = thursday; } else if (settingName == "friday") { value = friday; } else if (settingName == "saturday") { value = saturday; } else if (settingName == "sunday") { value = sunday; } else if (settingName == "everyday") { value = everyday; } else { return "invalid setting"; } return std::to_string(value); }
额外说明
- 若你是在Arduino环境中开发,只需把代码中的
std::string替换为Arduino的String类型,std::to_string(value)替换为String(value)即可。 - 枚举类型本质是整数,你的函数返回值是
String类型,所以必须把枚举值转换为字符串后再返回,否则会出现类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Bbb
相关产品推荐
相关产品推荐

