C ++中有一种简单的方法可以将字符串转换为枚举(类似于C#中的Enum.Parse
)吗?一个switch语句非常很长,所以我想知道是否有一种更简单的方法可以做到这一点?
编辑:
感谢您的所有回复。我意识到,对于我的特定情况,有一种更简单的方法。字符串总是包含字符'S'后跟一些数字,所以我只是做了
int i = atoi(myStr.c_str() + 1);
然后切换i。
答案 0 :(得分:26)
std::map<std::string, MyEnum>
(或unordered_map
)可以轻松完成。填充地图虽然和switch语句一样乏味。
答案 1 :(得分:23)
使用std::map<std::string, Enum>
并使用boost::map_list_of
轻松初始化它。
实施例,
enum X
{
A,
B,
C
};
std::map<std::string, X> xmap = boost::map_list_of("A", A)("B", B)("C",C);
答案 2 :(得分:11)
在某处看到了这个例子
#include <map>
#include <string>
enum responseHeaders
{
CONTENT_ENCODING,
CONTENT_LENGTH,
TRANSFER_ENCODING,
};
// String switch paridgam
struct responseHeaderMap : public std::map<std::string, responseHeaders>
{
responseHeaderMap()
{
this->operator[]("content-encoding") = CONTENT_ENCODING;
this->operator[]("content-length") = CONTENT_LENGTH;
this->operator[]("transfer-encoding") = TRANSFER_ENCODING;
};
~responseHeaderMap(){}
};
答案 3 :(得分:8)
我用这个“技巧”&gt; http://codeproject.com/Articles/42035/Enum-to-String-and-Vice-Versa-in-C
在
enum FORM {
F_NONE = 0,
F_BOX,
F_CUBE,
F_SPHERE,
};
插入
Begin_Enum_String( FORM )
{
Enum_String( F_NONE );
Enum_String( F_BOX );
Enum_String( F_CUBE );
Enum_String( F_SPHERE );
}
End_Enum_String;
如果enum中的值不是dublicate,则工作正常。
代码中的示例
enum FORM f = ...
const std::string& str = EnumString< FORM >::From( f );
反之亦然
assert( EnumString< FORM >::To( f, str ) );
答案 4 :(得分:5)
没有“内置方式”,但有一些方法可以通过将对value-name存储在数组中来实现这一点
enum myEnum
{
enumItem0,
enumItem1,
enumItem7 = 7,
enumItem8
};
std::vector<std::pair<myEnum,std::string>> gMap;
#define ADDITEM(x) gMap.push_back(std::pair<myEnum,std::string>(x,#x));
.....
ADDITEM(enumItem0);
ADDITEM(enumItem1);
ADDITEM(enumItem7);
ADDITEM(enumItem8);
答案 5 :(得分:2)
简而言之:没有。在C ++中,枚举是静态值,而不是像C#中的对象。我建议你使用带有if else
个语句的函数。
答案 6 :(得分:2)
您可以使用宏来尽量减少重复。这是诀窍:Enums, Macros, Unicode and Token-Pasting
答案 7 :(得分:2)
这对我有用:
enum NODES { Cone = 1, BaseColor = 2, NONE = 0 };
std::map<std::string, NODES> nodeMap;
nodeMap["Cone"] = NODES::Cone;
nodeMap["BaseColor"] = NODES::BaseColor;
答案 8 :(得分:1)
这是不可能的,因为名称在运行时不可用。在编译期间,每个枚举都用相应的整数值替换。
答案 9 :(得分:1)
虽然没有直接解决方案,但有一些可能的解决方法。
看看这个问题:Easy way to use variables of enum types as string in C?
答案 10 :(得分:0)
不,你必须使用if / then结构,或使用map或hash表或其他类型的关联数据结构来促进这一点。
答案 11 :(得分:0)
“附加问题:是否可以处理未定义的字符串?我的意思是如果我尝试获取responseHeaderMap [”cookie“]的值,那么值是什么?(前提是”response“未在responseHeaderMap中定义 - 巴特于2016年11月22日12:04“
嗯,您可以在之前进行检查:
auto it = responseHeaderMap.find("cookie");
if (it != responseHeaderMap.end())
{
// "cookie" exist, can take value
}
在“cookie”存在检查后,您可以使用以下方式获取它:
responseHeaderMap["cookie"]
希望这个帮助