Перечисление в строку: возвращает целочисленное значение перечисления, если неверно / не найдено

Итак, я реализовал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 в стек.

Любое решение?

Ответы на вопрос(4)

Ваш ответ на вопрос