是否可以输入枚举类型变量而不是使用static_cast

时间:2019-06-21 04:45:38

标签: c++ enums

我试图输入一个枚举的类型变量,但是如果不使用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
}
  

除了输入枚举类型值之外,还有其他选择

2 个答案:

答案 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;
}

online example

请注意,还有更多方法可以将“ 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;
}