2017-04-20 266 views
3

的 - 背景信息:枚舉類用C型串++

有一個在C++ 11已知爲可以存儲內部變量的枚舉類的類。不過,我只看到了類的類型是char:

enum class : char { 
    v1 = 'x', v2 = 'y' 
}; 

- 問:

有什麼辦法,我可以表達這種枚舉類類型的字符串?

例如,

enum class : string{ 
    v1 = "x", v2 = "y" 
}; 

- 我想什麼:

我嘗試使用它,但我得到的錯誤,我不知道如果我這樣做是正確與否。我想使用字符串的原因是它們能夠同時容納多個字符,所以它使它們對我的代碼更有用。

+0

好吧,這意味着我們只能將枚舉類表示爲char,而不是int,字符串或任何其他類型。 – Kourosh

+1

@CinCout評論中的所有內容都不正確。只有在沒有指定類型的情況下,作用域枚舉的基礎類型纔是「int」,在上例中不是這種情況。而'char'肯定不是'int'。 – Praetorian

+1

@Kourosh *在C++ 11中有一個類稱爲枚舉類* ...否,沒有這樣的類,'enum class'用於定義範圍枚舉。下面的答案鏈接到解釋這些內容的文檔。 – Praetorian

回答

4

在C++ 11或C++ 14中沒有辦法做到這一點。但是,您應該考慮使用enum class,然後對一些顯式函數或運算符進行編碼,以將其轉換爲std::string -s。

在C++ 11中有一個稱爲枚舉類的類,您可以在其中存儲變量。

那措辭是不正確的:枚舉類不存儲變量(但枚舉)。

所以,你可能代碼:

enum class MyEnum : char { 
    v1 = 'x', v2 = 'y' 
}; 

(這是可能的,因爲answered by druckermanly,因爲char整體式;當然你也可以不使用字符串代替)

再定義一些MyEnum string_to_MyEnum(const std::string&);功能(如果參數是一個意外的字符串,它可能會引發一些異常),另一個是std::string MyEnum_to_string(MyEnum);。你甚至可以考慮也有一些cast operator叫他們(但我不覺得可讀,在你的情況)。您還可以定義一個class MyEnumValue,其中包含一個MyEnum類型的單個數據成員,並且該類別具有cast operator,例如,

class MyEnumValue { 
    const MyEnum en; 
public: 
    MyEnumValue(MyEnum e) : en(e) {}; 
    MyEnumValue(const std::string&s) 
    : MyEnumValue(string_to_MyEnum(s)) {}; 
    operator std::string() const { return MyEnum_to_string(en);}; 
    operator MyEnum() const { return en }; 
    //// etc.... 
}; 

通過適當的更多的事情。MyEnumValue(見rule of five),你可能幾乎總是使用MyEnumValue代替MyEnum(這或許甚至可能是內部class MyEnumValue

+0

好吧,我看到了,也許最好說hold變量? – Kourosh

+0

不,最好使用*枚舉器*的標準術語。 –

+0

行得通的。謝謝:) – Kourosh

0

編譯器在內部將您的char轉換爲其等效的int表示形式(ASCII)。所以它不可能用字符串代替。