2015-04-21 8 views
0

У меня есть класс, как это перечисление:Как найти тип ENUM с заданной строкой?

class ContentTypeEnum { 

public: 

    // it might have more types 
    enum Code { TEXT, XML, APPLICATION_JSON}; 

    static const char* to_c_str(unsigned); 

}; 

Я использовал его, как это в моем коде, как сейчас.

ContentTypeEnum::APPLICATION_JSON 

Постановка задача: -

Теперь у меня есть строка, заданная так, что нужно использовать эту строку, а затем найти фактический тип ENUM итерации это мое выше перечисления.

Ниже мой код:

cout<<"Given String: " << data_args->pp_args->ter_strings[0].c_str() << endl; 
const char* test_str = data_args->pp_args->ter_strings[0].c_str(); 

Теперь, если test_str является xml или XML, то мне нужно установить это следующим образом:

TestClass::SetContentType(ContentTypeEnum::XML) 

Но если test_str является application_json или APPLICATION_JSON, то я необходимо установить его следующим образом:

TestClass::SetContentType(ContentTypeEnum::APPLICATION_JSON) 

И аналогичным образом для других. Ниже мой полный код:

cout<<"Given String: " << data_args->pp_args->ter_strings[0].c_str() << endl; 
char* test_str = data_args->pp_args->ter_strings[0].c_str(); 

// look up the exact ContentType from the enum using test_str string 
// and then set it to below method. 
TestClass::SetContentType(set_it_here_basis_on_string_test_str) 

Если кто-то проходит любую неизвестную строку, которая не существует в моем перечислении, то он должен использовать по умолчанию как TestClass::SetContentType(ContentTypeEnum::APPLICATION_JSON)

Что такое правильный путь для поиска точного перечисления тип, заданный строкой?

+0

Там нет построен в объекте, но это просто, чтобы написать свою собственную функцию, которая принимает строку, сравнивает его закодированные литералы, и возвращает перечисление. –

ответ

4

Предлагаю написать функцию, которая возвращает строку enum.

Code getCode(std::string const& s) 
{ 
    static std::map<std::string, Code> theMap{{"TEXT", TEXT}, 
              {"XML", XML} 
              {"APPLICATION_JSON", APPLICATION_JSON}}; 

    std::map<std::string, Code>::iterator it = theMap.find(s); 
    if (it != theMap.end()) 
    {  
     return it->second; 
    } 
    return APPLICATION_JSON; 
} 
+2

Я бы использовал 'const' и' find' и более подробно описывал значение по умолчанию 'APPLICATION_JSON'. –

+0

@MooingDuck - я бы, вероятно, бросил исключение или иным образом разрешил вызывающему абоненту знать, что совпадение не найдено, и позвольте вызывающему абоненту иметь дело с тем, что должно быть по умолчанию. Я бы, вероятно, также конвертировал входящую строку в верхний регистр, чтобы сделать совпадение без учета регистра. –

+0

@AndrewHenle: OP сказал: «Если кто-то передает какую-либо неизвестную строку, которой нет в моем перечислении, то она должна использоваться по умолчанию в качестве TestClass :: SetContentType (ContentTypeEnum :: APPLICATION_JSON)», поэтому я последовал этому. Исключение, вероятно, не является правильной идеей для проверки ввода, но, возможно, 'bool try_get_code (std :: string const &, Code &)' не будет amis. –

Смежные вопросы