C ++ строка для перечисления - PullRequest
16 голосов
/ 23 августа 2011

Есть ли в C ++ простой способ преобразовать строку в перечисление (аналогично Enum.Parse в C #)? Оператор switch будет иметь длину очень , поэтому мне интересно, есть ли более простой способ сделать это?

EDIT:

Спасибо за все ваши ответы. Я понял, что есть гораздо более простой способ сделать это для моего конкретного случая. Строки всегда содержали символ «S», за которым следовало какое-то число, поэтому я просто сделал

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

, а затем сделал переключение на я.

Ответы [ 12 ]

26 голосов
/ 23 августа 2011

A std::map<std::string, MyEnum> (или unordered_map) может сделать это легко. Заполнение карты будет таким же утомительным, как и оператор switch.

23 голосов
/ 23 августа 2011

Используйте 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);
11 голосов
/ 06 января 2014

видел этот пример где-то

#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(){}
};
8 голосов
/ 15 апреля 2013

Я использую эти "хитрости"> http://codeproject.com/Articles/42035/Enum-to-String-and-Vice-Versa-in-C

После

enum FORM {
    F_NONE = 0,
    F_BOX,
    F_CUBE,
    F_SPHERE,
};

insert

Begin_Enum_String( FORM )
{
    Enum_String( F_NONE );
    Enum_String( F_BOX );
    Enum_String( F_CUBE );
    Enum_String( F_SPHERE );
}
End_Enum_String;

Работает нормально, если значения в enum не повторяются.

Пример в коде

enum FORM f = ...
const std::string& str = EnumString< FORM >::From( f );

и наоборот

assert( EnumString< FORM >::To( f, str ) );
5 голосов
/ 23 августа 2011

Не существует «встроенного способа», но есть способы достичь этого путем сохранения значения пары 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);
4 голосов
/ 06 мая 2016

это сработало для меня:

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

std::map<std::string, NODES> nodeMap;
nodeMap["Cone"] = NODES::Cone;
nodeMap["BaseColor"] = NODES::BaseColor;
2 голосов
/ 23 августа 2011

Вы можете использовать макрос, чтобы минимизировать повторение. Вот трюк: Перечисления, макросы, Юникод и вставка токенов

2 голосов
/ 23 августа 2011

Короче говоря: нет ни одного. В C ++ перечисления являются статическими значениями, а не объектами, как в C #. Я предлагаю вам использовать функцию с некоторыми if else утверждениями.

1 голос
/ 23 августа 2011

Хотя прямого решения не существует, существует несколько возможных путей обхода.

Взгляните на этот вопрос: Простой способ использовать переменные типов enum в виде строки в C?

1 голос
/ 23 августа 2011

Это невозможно, потому что имена недоступны во время выполнения. Во время компиляции каждое перечисление заменяется соответствующим целочисленным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...