C ++字符串到枚举

时间:2011-08-23 14:56:52

标签: c++ string enums

C ++中有一种简单的方法可以将字符串转换为枚举(类似于C#中的Enum.Parse)吗?一个switch语句非常很长,所以我想知道是否有一种更简单的方法可以做到这一点?

编辑:

感谢您的所有回复。我意识到,对于我的特定情况,有一种更简单的方法。字符串总是包含字符'S'后跟一些数字,所以我只是做了

int i = atoi(myStr.c_str() + 1);

然后切换i。

12 个答案:

答案 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"]

希望这个帮助