std :: cin提取到枚举

时间:2011-01-26 16:26:18

标签: c++ enums stream

我不明白为什么我不能这样做:

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

问题是C ++不聪明或者我错了什么?

1 个答案:

答案 0 :(得分:4)

您可以,但您需要编写自定义operator>>重载:

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

您无法使用默认std::istream operator>>重载执行此操作的原因是右侧参数必须与运算符重载的参数完全匹配,因为它是由非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?