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?