C++字符串到枚举

Dan*_*iel 17 c++ string enums

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

编辑:

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

int i = atoi(myStr.c_str() + 1);
Run Code Online (Sandbox Code Playgroud)

然后切换i.

Mar*_*som 27

A std::map<std::string, MyEnum>(或unordered_map)可以轻松完成.填充地图与切换语句一样繁琐.

  • +1 for `std::unordered_map`:对于大型枚举,散列可能是最简单和最快的解决方案。 (4认同)

Naw*_*waz 24

使用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);
Run Code Online (Sandbox Code Playgroud)

  • 现在似乎是`boost :: assign :: map_list_of` (2认同)

Guy*_*y L 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(){}
};
Run Code Online (Sandbox Code Playgroud)

  • @Napalm我刚刚重新编译并测试了它.你可能没有包含<map>和<string>. (3认同)
  • 与这么多这样的答案一样,这个答案可以使用一个示例来说明如何调用代码以及预期结果。要使用此结构,显然开发人员必须声明一个 responseHeaderMap 类型的变量,然后对该变量调用 [] 运算符。 (2认同)

And*_*kiy 8

我用这个"技巧"> http://codeproject.com/Articles/42035/Enum-to-String-and-Vice-Versa-in-C

enum FORM {
    F_NONE = 0,
    F_BOX,
    F_CUBE,
    F_SPHERE,
};
Run Code Online (Sandbox Code Playgroud)

插入

Begin_Enum_String( FORM )
{
    Enum_String( F_NONE );
    Enum_String( F_BOX );
    Enum_String( F_CUBE );
    Enum_String( F_SPHERE );
}
End_Enum_String;
Run Code Online (Sandbox Code Playgroud)

如果enum中的值不是dublicate,则工作正常.

代码示例

enum FORM f = ...
const std::string& str = EnumString< FORM >::From( f );
Run Code Online (Sandbox Code Playgroud)

反之亦然

assert( EnumString< FORM >::To( f, str ) );
Run Code Online (Sandbox Code Playgroud)


cpr*_*mer 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));
Run Code Online (Sandbox Code Playgroud)

.....

ADDITEM(enumItem0);
ADDITEM(enumItem1);
ADDITEM(enumItem7);
ADDITEM(enumItem8);
Run Code Online (Sandbox Code Playgroud)

  • 不要使用对矢量,使用地图! (13认同)
  • @FerdinandBeyer映射允许进行O(log n)查找,但需要更大的空间。正确分类的向量对可以在较小的空间中以相同的查找速度。对于一定数量的项目,几乎肯定不需要地图。 (2认同)

Eli*_*ias 5

这对我有用:

enum NODES { Cone = 1, BaseColor = 2, NONE = 0 };

std::map<std::string, NODES> nodeMap;
nodeMap["Cone"] = NODES::Cone;
nodeMap["BaseColor"] = NODES::BaseColor;
Run Code Online (Sandbox Code Playgroud)