Enum to string: retorna o valor inteiro do enum se inválido / não encontrado
Então, eu implementei umenumToString
função para várias enums que eu uso muito (muitas vezes perguntado em SO:Existe uma maneira simples de converter enum C ++ para string?, Maneira fácil de usar variáveis de tipos enum como string em C?...) Isso faz com que as mensagens de erro WAY sejam mais fáceis de depurar, mas eu tenho que manter a função para adicionar os valores que não possuem descrição de string às vezes.
Meu código é assim:
<code>typedef std::map<my_enum_e, const char *> enum_map_t; static bool s_enum_map_initialized = false; static enum_map_t s_enum_strings; static void s_init_maps() { #define ADD_ENUM( X ) s_enum_strings[X] = #X; if( s_enum_strings.size() == 0) { ADD_CLASS( MY_ENUM_1 ); ADD_CLASS( MY_ENUM_2 ); /* ... all enums */ } s_enum_map_initialized = true; } const char *Tools::enumCString( my_enum_e e ) { if( ! s_enum_map_initialized ) { s_init_maps(); } // todo: use the iterator instead of searching twice if( s_enum_strings.find(e) != s_enum_strings.end() ) { return s_class_strings[e]; } return "(unknown enum_e)"; } </code>
Agora, o que eu quero é que quando eunão faça encontre o enum no mapa, para retornar"(unknown enum %d)", e
. Qual vai me dar o valor do enum que eu perdi.
Dessa forma, mesmo que eu não o tenha adicionado ao mapa, ainda tenho seu valor e posso depurar meu programa.
Eu não consigo encontrar uma maneira de fazer isso simplesmente: uma string instanciada na pilha será destruída logo após o retorno, umaestático stringstream não é thread-safe, ...
editar: claro, usando umstd::string
como tipo de retorno me permitiria formatá-lo, mas eu chamo essas funções muito frequentemente no meu código, eu percebi que passar umconst char *
O ponteiro é mais rápido, já que não tenho que empurrar o std :: string para a pilha toda vez.
Qualquer solução?