c++ - std::cin 提取到枚举

标签 c++ enums stream

我不明白为什么我做不到:

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

问题是 C++ 不够智能还是我搞错了什么?

最佳答案

你可以,但是你需要写一个自定义的 operator>> 重载:

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

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

另一种选择是从流中将整数表示形式提取到 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? )

关于c++ - std::cin 提取到枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4807033/

相关文章:

在 C 中将宏转换为枚举类型

java - 自定义枚举属性给出错误 String types not allowed

node.js - Node - 可读流 pipe() 在 for 循环中覆盖以前的流

algorithm - 请识别此算法 : probabilistic top-k elements in a data stream

c++ - 使用 GDB 的 Python pretty-print 不支持 map 的索引运算符 []

C++ STL - STL sort() 的第三个参数如何工作?

c++ - 在 C++ 中使用条件循环删除

android - 如何在 Kotlin 的枚举类上泛化函数?

java - 可以从流中读取带符号的字节吗?

android - Android模拟器的第一次使用