我可以使用宏将std::tring转换为对应的枚举吗?
Can I Use Macros To Convert std::tring To Corresponding Enum?
我正在尝试 return 基于字符串值的枚举(字符串来自 json 文件,如果重要的话)
基本上,在代码中我会写 enumName::MyName
的地方,我希望能够有类似
的东西
std::string name = "MyName";
return enumName::name; // this gets converted to enumName::MyName
显然这是不正确的语法。我想到了使用宏来解决我的问题,所以这是我目前的尝试:
#define stringToName(n) enumName::##n
我在哪里使用了 ##
标记粘贴运算符。但在那种情况下,n
在被复制之前不会被评估,所以下面的事情会发生
return stringToName("MyName");
//which becomes
return enumName::"MyName";
或
std::string name = "MyName";
return stringToName(name);
//which becomes
return enumName::name;
这不是我想要的。有没有办法让它工作? (理想情况下不必在字典或类似的东西中手动编写每个枚举名称)
最后,我找到了使用 Jerry 链接的问题中提到的 magic_enum 库的解决方案。我不完全理解 how/why 它还可以工作,但它很干净并且可以完成工作。
我正在尝试 return 基于字符串值的枚举(字符串来自 json 文件,如果重要的话)
基本上,在代码中我会写 enumName::MyName
的地方,我希望能够有类似
std::string name = "MyName";
return enumName::name; // this gets converted to enumName::MyName
显然这是不正确的语法。我想到了使用宏来解决我的问题,所以这是我目前的尝试:
#define stringToName(n) enumName::##n
我在哪里使用了 ##
标记粘贴运算符。但在那种情况下,n
在被复制之前不会被评估,所以下面的事情会发生
return stringToName("MyName");
//which becomes
return enumName::"MyName";
或
std::string name = "MyName";
return stringToName(name);
//which becomes
return enumName::name;
这不是我想要的。有没有办法让它工作? (理想情况下不必在字典或类似的东西中手动编写每个枚举名称)
最后,我找到了使用 Jerry 链接的问题中提到的 magic_enum 库的解决方案。我不完全理解 how/why 它还可以工作,但它很干净并且可以完成工作。