2011-01-26 28 views
2

我不明白爲什麼我不能到:給std :: cin提取物枚舉

enum MyEnum {X=1, Y}; 
... 
X x; 
std::cin >> x; 

問題是,C++不聰明enougth還是我誤以爲的東西嗎?

+0

`MyEnum`是用戶定義的類型。你認爲語言(編譯器)有多聰明是爲了「猜測」你想輸出任何給定的用戶定義類型的格式? – 2011-01-26 19:02:36

回答

4

可以,但你需要編寫自定義operator>>過載:

std::istream& operator>>(std;:istream& is, MyEnum& e) { ... } 

你不能使用默認std::istreamoperator>>重載這樣做的原因是,右側的參數必須與運營商的參數完全匹配過載,因爲它是由非const引用引起的(因爲操作符將通過分配給它來修改對象)。

另一種選擇是從流整數表示提取到一個int,然後將它轉換爲枚舉類型:

int i; 
MyEnum e; 

if (!(std::cin >> i)) { /* handle error */ } 
e = static_cast<MyEnum>(i); 

您可能需要執行一些錯誤檢查這裏,除非你確信提取的值可以用MyEnum表示。 (從技術上說,你也應該小心提取到int,因爲int可能無法代表MyEnum所有的值。還有的是如何做到這一點在回答另一個問題的解釋,How can I extend a lexical cast to support enumerated types?