2011-06-08 227 views
42

可能重复:
Is there a simple script to convert C++ enum to string?枚举到字符串C++

我经常觉得我需要一个枚举转换为C++字符串

我总是最后做:

enum Enum{ Banana, Orange, Apple } ; 

char * getTextForEnum(int enumVal) 
{ 
    switch(enumVal) 
    { 
    case Enum::Banana: 
    return "bananas & monkeys"; 
    case Enum::Orange: 
    return "Round and orange"; 
    case Enum::Apple: 
    return "APPLE" ; 

    default: 
    return "Not recognized.."; 
    } 
} 

有没有更好的或公认的习惯用法?

+0

也许使用'的std ::地图<整型,的std :: string>的'代替枚举和开关?通过对对象进行一些包装,您可以使它足够聪明,可以重用为所有应用程序的错误代码查找和处理程序。 – AJG85 2011-06-08 15:44:59

+3

一个改进是省略'default:'子句,同时调高编译器的警告级别并将警告视为错误。这样,如果你扩展了枚举列表,编译器会在你的switch语句中发出警告并失败,提醒你扩展交换器。有些人说你应该总是有一个默认的,但我相信这是一个缺乏实际可以帮助你的场景。 – 2011-06-08 15:46:15

回答

38
enum Enum{ Banana, Orange, Apple } ; 
static const char * EnumStrings[] = { "bananas & monkeys", "Round and orange", "APPLE" }; 

const char * getTextForEnum(int enumVal) 
{ 
    return EnumStrings[enumVal]; 
} 
+17

仅适用于连续枚举。 – SasQ 2012-12-12 06:40:30

+3

@SasQ,我在这里有一个更广泛的答案:http://stackoverflow.com/a/11586083/5987该线程也有很多其他的好建议。 – 2012-12-12 15:27:55

+0

更好的原型是'const char * getTextForEnum(int)const;'我的朋友。最佳实践。 – 2016-04-12 17:30:19

9

您可以将枚举值和字符串放入STL映射中。那么你可以像这样使用它。

return myStringMap[Enum::Apple]; 
19

匿名查找表的,而不是长期switch语句:

return (const char *[]) { 
    "bananas & monkeys", 
    "Round and orange", 
    "APPLE", 
}[enumVal];