因此,我为我经常使用的几个枚举实现了enumToString函数(通常在SO中询问:Is there a simple way to convert C++ enum to string?Easy way to use variables of enum types as string in C?,...)。
这使错误消息更易于调试,但是我必须维护该函数以添加有时没有字符串描述的值。

我的代码如下所示:

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)";
}

现在,我想要的是,当我在 map 上找不到枚举时,返回"(unknown enum %d)", e。这将为我提供我错过的枚举的值(value)。

这样,即使我没有将其添加到 map 中,我仍然具有其值,并且可以调试程序。

我找不到简单的方法:返回后立即销毁堆栈上实例化的字符串流,静态字符串流不是线程安全的,...

编辑:当然,使用std::string作为返回类型将允许我格式化它,但是我在代码中经常调用这些函数,我认为传递const char *指针会更快,因为我不必按下std每次将:: string放入堆栈。

有什么办法吗?

最佳答案

返回std::string而不是char*

这将允许您使用std::stringstream生成消息。然后,调用站点只需要使用.c_str( )上的std::string成员函数来获取C风格的指针(如果需要)。

07-24 09:38
查看更多