Enumerar a cadena: devolver el valor entero de enumeración si no es válido / no encontrado

Entonces, implementé unenumToString función para varias enumeraciones que uso mucho (a menudo se pregunta en SO:¿Hay una forma sencilla de convertir enumeración de C ++ a cadena?, ¿Una forma sencilla de usar variables de tipos de enumeración como cadena en C?, ...). Esto hace que los mensajes de error sean más fáciles de depurar, pero tengo que mantener la función para agregar los valores que a veces no tienen una descripción de cadena.

Mi código se ve así:

<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>

Ahora, lo que quiero, es que cuando yono hacer Encuentra la enumeración en el mapa, para volver."(unknown enum %d)", e . Lo que me dará el valor de la enumeración que me perdí.

De esta manera, incluso si no lo agregué al mapa, todavía tengo su valor y puedo depurar mi programa.

No puedo encontrar una manera de hacerlo simplemente: una secuencia de cadenas instanciada en la pila se destruirá justo después de la devolución, unaestático stringstream no es seguro para subprocesos, ...

editar: por supuesto, usando unstd::string como tipo de retorno me permitiría formatearlo, pero llamo a estas funciones muy a menudo en mi código, pensé que al pasar unconst char * el puntero es más rápido, ya que no tengo que empujar la cadena std :: en la pila cada vez.

¿Alguna solución?

Respuestas a la pregunta(4)

Su respuesta a la pregunta