std::cin 提取到枚举

Rug*_*rra 3 c++ enums stream

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

enum MyEnum {X=1, Y};
...
X x;
std::cin >> x;
Run Code Online (Sandbox Code Playgroud)

问题是 C++ 不够聪明还是我弄错了?

Jam*_*lis 5

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

std::istream& operator>>(std;:istream& is, MyEnum& e) { ... }
Run Code Online (Sandbox Code Playgroud)

不能使用默认重载执行此操作的原因std::istream operator>>是,右侧参数必须与运算符重载的参数完全匹配,因为它是由非常量引用获取的(因为运算符将通过分配给对象来修改对象)。

另一种选择是将流中的整数表示形式提取到 an 中int,然后将其转换为枚举类型:

int i;
MyEnum e;

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

您可能想在此处执行一些错误检查,除非您确定提取的值能够由 表示MyEnum。(从技术上讲,您还应该小心提取到int,因为int可能无法表示 的所有值MyEnum。在另一个问题的答案中解释了如何执行此操作,如何扩展词法转换以支持枚举类型?