2012-02-02 61 views
3

我現在的程序使用3個不同的枚舉:枚舉作爲參數,返回字符串

enum ThingEnum{ 
    Thing1 = 0, 
    Thing2 = 1, 
    Thing3 = 2, 
    OtherThing = 3 
}; 
enum ReturnEnum { 
    Success = 4,// the method did what it is supposed to 
    Error1 = 5,// an error occured 
    Error2 = 6,// an error occured 
    Error3 = 7,// an error occured 
    Error4 = 8,// a fatal error occured program must terminate 
    Pointer = 9// the method may need to be called again 
}; 
enum TypeEnum { 
    Type1 = 10, 
    Type2 = 11, 
    Type3 = 12, 
    Type4 = 13, 
    OtherType = 14 
}; 

我想要做的就是創建一個全局函數,它接受一個枚舉並返回一個字符串(如枚舉的值是真的只是一個總是有值的專用變量名稱)。 是否可以創建一個採用泛型枚舉的函數?例如

string enumToString (enum _enum){} 

還是我必須爲每個不同的枚舉做一個函數?只是一個可能的想法,我做了一些閱讀,並且一些編譯器允許Enum解析爲int,所以我可以將enum作爲int來傳遞,然後使用它?

+0

所以,你想要做的是一個枚舉值轉換爲字符串?也許你應該修改問題標題...... – tenfour 2012-02-02 11:41:57

+0

'因爲enum的值實際上只是一個總是具有值的專用變量名'whut – 2012-02-02 11:52:02

+0

@Lightness當編譯器讀取枚舉Ex {this,thisTo};它會爲它們生成值(除非它們被設置爲具體值),但要訪問它們,您需要使用表示該值的名稱,就像使用解析運算符來獲取類中的精確方法。因爲有關枚舉的文獻將陳述「一個枚舉將解析爲一個特定的值(一個int地址),但即使該值已知反向轉換也不會解決」 – gardian06 2012-02-02 12:18:33

回答

2

有 「的ToString樣」 函數實現的兩個選項:

  1. 實現一個簡單的靜態的switch-case功能。

代碼:

std::string ThingEnumToString(ThingEnum thing) 
{ 
    switch (thing) { 
    case Thing1: 
     return std::string("Thing1"); 
    case Thing2:  
     return std::string("Thing2"); 
    case Thing3: 
     return std::string("Thing3");   
    case OtherThing: 
     return std::string("OtherThing"); 
    default: 
     throw std::invalid_argument("thing"); 
     break; 
    } 
} 
  1. 實現與詞典查找一個靜態函數。

代碼:

typedef std::map<ThingEnum, std::string> ThingsMap; 

static ThingsMap GetThingsMap() 
{ 
    ThingsMap things_map; 
    things_map.insert(ThingsMap::value_type(Thing1, std::string("Thing1"))); 
    things_map.insert(ThingsMap::value_type(Thing2, std::string("Thing2"))); 
    things_map.insert(ThingsMap::value_type(Thing3, std::string("Thing3"))); 
    things_map.insert(ThingsMap::value_type(OtherThing, std::string("OtherThing"))); 
    return things_map; 
} 

static std::string ThingEnumToString(ThingEnum thing) 
{ 
    static const ThingsMap things(GetThingsMap()); 
    ThingsMap::const_iterator it = things.find(thing); 
    if (it != things.end()) { 
     return it->second; 
    } else { 
     throw std::invalid_argument("thing"); 
    } 
} 
+1

我喜歡選項1.它看起來更乾淨,更清晰。 – gardian06 2012-02-02 12:26:13

+0

就個人而言,我選擇第一個枚舉常量時。相反,當存在大量枚舉常量時,第二個是實際的。 – 2012-02-02 12:32:34

0

enum名稱只有在編譯前纔有意義。我認爲沒有一種便捷或標準定義的方式來以乾淨的方式來做到這一點。

如下你可以這樣做:

std::string getName(ThingEnum x) 
{ 
    switch (x) 
    { 
    case Thing1: 
     return "Thing1"; 
    case Thing2: 
     return "Thing2"; 
    //.... 
    } 
} 
+0

基本上,如果我可以得到枚舉進入函數,那麼我基本上可以像case切換一樣返回正確的字符串。我不一定要讓它返回自己的名字,但至少要對它進行邏輯檢查。 – gardian06 2012-02-02 11:50:43

+0

@ gardian06是的,就像在我的編輯中一樣,但它不是通用的(無論如何都沒有意義),而且你必須硬編碼很多東西。無論如何,你爲什麼還需要這個? – 2012-02-02 11:54:23

+0

生成日誌消息。因爲我必須在這些之上集成東西,並且「返回的方法:6」與調用的「方法返回:Error2」沒有多大意義。 – gardian06 2012-02-02 12:05:01

1

不,枚舉沒有隱含的基類。

您可以使用模板或函數重載。但是,是的,你將不得不親手做。

enum →字符串「轉換」列出here有一些技巧。

2

這是在那裏我主張用宏來使你的代碼更容易理解/維護(並刪除錯誤的至少一個源)的情況下

一個

因此

#define TOSTRING(name) case name: return #name 
    switch (val) 
    { 
     TOSTRING(Thing1); 
     TOSTRING(Thing2); 
     default: 
     //bad things happened. 
    }