Есть ли альтернатива для ввода переменной перечислимого типа вместо использования static_cast - PullRequest
0 голосов
/ 21 июня 2019

Я пытался ввести переменную перечислимого типа, но я не мог сделать это без использования операции 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 ]

1 голос
/ 21 июня 2019

Вот пример, как я бы подошел к этому (расширяя ответ якоби).

#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'.

0 голосов
/ 21 июня 2019

Вы должны будете реализовать свой собственный оператор >> для перечисления 'month', чтобы делать то, что вы хотите.

Пример:

std::istream& operator>>(std::istream& is, month& m)
{
    int tmp;
    if (is >> tmp)
        m = static_cast<month>(tmp);
    return is;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...