Enum to string: zwraca całkowitą wartość liczbową, jeśli jest niepoprawna / nie znaleziono

Więc wdrożyłemenumToString funkcja dla kilku wyliczeń, których używam dużo (często zadawane w SO:Czy istnieje prosty sposób przekonwertowania enum C ++ na łańcuch?, Łatwy sposób użycia zmiennych typu wyliczeniowego jako ciągu znaków w C?, ...). To sprawia, że ​​komunikaty o błędach są łatwiejsze do debugowania, ale muszę zachować funkcję dodawania wartości, które czasami nie mają opisu ciągu.

Mój kod wygląda tak:

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

Teraz chcę tego, kiedy janie znajdź wyliczenie na mapie, aby powrócić"(unknown enum %d)", e . Co da mi wartość enum, którą przegapiłem.

W ten sposób, nawet jeśli nie dodałem go do mapy, nadal mam jego wartość i mogę debugować mój program.

Po prostu nie mogę znaleźć sposobu, aby to zrobić: stringstream instanciated na stosie zostanie zniszczony zaraz po powrocie, astatyczny stringstream nie jest bezpieczny dla wątków, ...

edytować: oczywiście za pomocą astd::string ponieważ typ powrotu pozwoliłby mi go sformatować, ale nazywam te funkcje bardzo często w moim kodzie, pomyślałam, że przechodzęconst char * Wskaźnik jest szybszy, ponieważ nie muszę naciskać std :: string na stos za każdym razem.

Jakieś rozwiązanie?

questionAnswers(4)

yourAnswerToTheQuestion