我试图输入一个枚举的类型变量,但是如果不使用static_cast操作,我将无法做到这一点
#include<iostream>
using namespace std;
enum month
{
JAN,
FEB,
MAY,
JUNE,
OCTOBER,
DECEMBER,
};
int main()
{
month This;
cin >> This; <<_______________________ Causes a compiler error
system("pause");
return 0;
}
一种解决方法是读取整数,然后使用static_cast 强制编译器将整数值放入枚举类型
{
int input_month;
cin >> input_month;
month This = static_cast<month>(input_month);<<_____________Works
}
除了输入枚举类型值之外,还有其他选择
答案 0 :(得分:1)
这是我将如何处理此问题的示例(扩展了雅各比的答案)。
#include <iostream>
#include <stdexcept>
enum month
{
JAN,
FEB,
MAY,
JUNE,
OCTOBER,
DECEMBER,
};
month int2month(int m)
{
switch(m)
{
case 1: return month::JAN;
case 2: return month::FEB;
case 3: return month::MAY;
case 6: return month::JUNE;
case 10: return month::OCTOBER;
case 12: return month::DECEMBER;
default: throw std::invalid_argument("unknown month");
}
}
std::istream& operator>>(std::istream& is, month& m)
{
int tmp;
if (is >> tmp)
m = int2month(tmp);
return is;
}
int main()
{
month This;
try{
std::cin >> This;
}
catch(std::invalid_argument& e){
// TODO: handle
}
return 0;
}
请注意,还有更多方法可以将“ int”映射到月份。 例如,我认为您的代码将获得与以下结果相同的结果:
month int2month(int m)
{
switch(m)
{
case 0: return month::JAN;
case 1: return month::FEB;
case 2: return month::MAY;
case 3: return month::JUNE;
case 4: return month::OCTOBER;
case 5: return month::DECEMBER;
default: throw std::invalid_argument("unknown month");
}
}
超出此问题的范围:
还请注意,您可以编写“ string2month”函数。然后,您可以将“ tmp”设置为字符串。根据仅包含“ tmp”的数字,您可以将“ tmp”转换为“ int”以将其转换为一个月,或尝试将“ tmp”转换为“ month”。 这将允许像JAN或January这样的输入,具体取决于'string2month'的实现。
答案 1 :(得分:0)
对于枚举“月”,您将必须实现自己的运算符>>。
示例:
std::istream& operator>>(std::istream& is, month& m)
{
int tmp;
if (is >> tmp)
m = static_cast<month>(tmp);
return is;
}