【发布时间】:2012-04-16 13:41:16
【问题描述】:
所以,我为我经常使用的几个枚举实现了一个 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)";
}
现在,我想要的是,当我 没有 在地图中找到枚举时,返回 "(unknown enum %d)", e 。这会给我我错过的枚举的价值。
这样,即使我没有将它添加到地图中,我仍然有它的价值,我可以调试我的程序。
我找不到简单的方法:在堆栈上实例化的字符串流将在返回后立即销毁,静态字符串流不是线程安全的,...
编辑:当然,使用std::string 作为返回类型可以让我对其进行格式化,但我在代码中经常调用这些函数,我认为传递const char * 指针是更快,因为我不必每次都将 std::string 推入堆栈。
有什么办法吗?
【问题讨论】:
-
为什么是
const char*而不是std::string?如果std::string,那么你可以使用std::ostringstream(或类似的)。 -
查看我对尼克回答的评论:我选择 const char * 来加快通话速度。
-
您担心错误消息的性能?您是否实际测量过,在某些至少半典型的使用中,错误报告占用了运行时间的很大一部分案例?
-
@Gui13:使用
switch而不是map会更快。 快得多。只要您不包含default子句,如果缺少枚举器,任何值得其盐的编译器都会警告您。请参阅我的答案以自动生成此开关。 -
我实际上赞成你的答案,虽然我不使用 boost(看看你有多少包含单个 switch())。这是一个更好的解决方案,因为没有默认值将优雅地解决我的问题!
标签: c++ string debugging map enums