Итак, я применил функцию enumToString
для нескольких перечислений, которые я использую много (часто спрашивается в SO: Есть ли простой способ преобразования С++ enum в строку?, Простой способ использовать переменные типов перечисления как строку в C?,...).
Это облегчает отладку сообщений об ошибках WAY, но я должен поддерживать функцию для добавления значений, которые иногда не содержат описания строк.
Мой код выглядит следующим образом:
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)";
}
Теперь, что я хочу, это то, что, когда я не нахожу enum на карте, верните "(unknown enum %d)", e
. Который даст мне значение перечисления, которое я пропустил.
Таким образом, даже если я не добавил его к карте, у меня все еще есть его значение, и я могу отлаживать свою программу.
Я не могу найти способ сделать это просто: строковый поток, созданный в стеке, будет уничтожен сразу после возврата, строковый поток static не является потокобезопасным,...
изменить: конечно, использование типа std::string
в качестве возвращаемого типа позволит мне форматировать его, но я часто вызываю эти функции в своем коде, я полагал, что передача указателя const char *
быстрее, так как мне не нужно каждый раз нажимать std::string на стек.
Любое решение?