C++ std::cin提取到枚举
我不明白为什么我不能这么说:C++ std::cin提取到枚举,c++,enums,stream,C++,Enums,Stream,我不明白为什么我不能这么说: enum MyEnum {X=1, Y}; ... X x; std::cin >> x; 问题是C++不聪明,我错了什么? 可以,但是你需要编写一个自定义的代码>运算符> 过载: std::istream& operator>>(std;:istream& is, MyEnum& e) { ... } 无法使用默认的std::istream运算符>>重载执行此操作的原因是,右侧参数必须与运算符重载的参数完全匹配,
enum MyEnum {X=1, Y};
...
X x;
std::cin >> x;
问题是C++不聪明,我错了什么? 可以,但是你需要编写一个自定义的代码>运算符> <代码>过载:
std::istream& operator>>(std;:istream& is, MyEnum& e) { ... }
无法使用默认的std::istream
运算符>>
重载执行此操作的原因是,右侧参数必须与运算符重载的参数完全匹配,因为它是由非常量引用获取的(因为运算符将通过赋值来修改对象)
另一个选项是将流中的整数表示形式提取为int
,然后将其转换为枚举类型:
int i;
MyEnum e;
if (!(std::cin >> i)) { /* handle error */ }
e = static_cast<MyEnum>(i);
inti;
髓鞘e;
如果(!(std::cin>>i)){/*句柄错误*/}
e=静态压力(i);
您可能希望在这里执行一些错误检查,除非您确定提取的值能够用
MyEnum
表示。(从技术上讲,您还应该小心提取到int
,因为int
可能无法表示MyEnum
的所有值。在对另一个问题的回答中,有一个关于如何执行此操作的解释,)MyEnum
是用户定义的类型。您认为语言(编译器)必须有多聪明才能“猜测”您想要输出任何给定的用户定义类型的格式?@André:没有那么多。枚举由整数表示。顺便说一下,我想输入,而不是输出。classx{intx;}
也用整数表示。它不会改变它是用户定义类型(UDT)的事实。这也是编译器不隐式转换为枚举类型的原因。James答案中的“输入整数+强制转换为枚举”是一种规避此问题的方法。