2011-06-08 199 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];