Перечисление в строку: возвращает целочисленное значение перечисления, если неверно / не найдено
Итак, я реализовалenumToString
функция для нескольких перечислений, которые я часто использую (часто спрашивается в SO:Есть ли простой способ конвертировать перечисление C ++ в строку?, Простой способ использовать переменные типов перечисления в виде строки в C?, ...).
This makes the error messages WAY easier to debug, but I have to maintain the function to add the values that have no string description sometimes.
Мой код выглядит так:
<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>
Теперь, что я хочу, это когда яdon't найти перечисление на карте, чтобы вернуться"(unknown enum %d)", e
, Что даст мне значение перечисления, которое я пропустил.
Таким образом, даже если я не добавил его на карту, у меня все еще есть его значение, и я могу отлаживать свою программу.
Я не могу найти способ сделать это просто: поток строк, созданный в стеке, будет уничтожен сразу после возврата,static stringstream не является потокобезопасным, ...
edit: конечно, используяstd::string
поскольку возвращаемый тип позволил бы мне отформатировать его, но я очень часто вызываю эти функции в своем коде, я решил передатьconst char *
Указатель работает быстрее, так как мне не нужно каждый раз помещать std :: string в стек.
Любое решение?