Вот пример, как я бы подошел к этому (расширяя ответ якоби).
#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» в «месяц».Это позволило бы вводить данные, такие как JAN или январь, в зависимости от реализации 'string2month'.