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?

questionAnswers(4)

yourAnswerToTheQuestion