C++, как получить из консоли char и использовать его в перечислении

Только начал изучать C++, пытаюсь разобраться с перечислениями. Пытаюсь написать простой калькулятор, вот код:

#include <iostream>
#include <cmath>


enum class Operation : char {
    ADD = '+',
    SUBSTRACT = '-',
    MULTIPLY = '*',
    DEVIDE = '/',
    PERCENT = '%',
    POWER = '^'
};


void calculation(double num1, Operation operation, double num2) {
    
    switch (operation) {
        case Operation::ADD:
            std::cout << num1 + num2;
            break;
        case Operation::SUBSTRACT:
            std::cout << num1 - num2;
            break;
        case Operation::MULTIPLY:
            std::cout << num1 * num2;
            break;
        case Operation::DEVIDE:
            if (num2 == 0) {
                std::cout << "divident " << num2 << " is zero!";
            }
            else {
                std::cout << num1 / num2;
            }
            break;
        case Operation::PERCENT:
            std::cout << 100.0 * (num1 / num2) << '%';
            break;
        case Operation::POWER:
            std::cout << std::pow(num1, num2);
            break;
    }
}


int main() {

    double num1, num2;
    Operation operation;

    std::cin >> num1 >> static_cast<Operation>(operation) >> num2;

    calculation(num1, operation, num2);


    return 0;
}

Пытаюсь из консоли получить два числа double и операцию char. Далее с помощью switch case вывести результат операции в консоль в функции calculator. Проблема в том, что функция calculator ждет тип Operation, а не char. А считать с консоли тип данных Operation не получается, компилятор ругается. Как быть в такой ситуации?


Ответы (2 шт):

Автор решения: IvanZharov

Необходимо сначала прочитать с консоли char и записать в переменную char. Затем создать переменную типа Operation и присвоить ей static_cast(<char из консоли>). Функция main перепишется следующим образом:

int main() {

double num1, num2;
char operation_input;

std::cin >> num1 >> operation_input >> num2;
Operation operation = static_cast<Operation>(operation_input);

calculation(num1, operation, num2);


return 0;
}
→ Ссылка
Автор решения: AlexGlebe

Так как у вас перечисление это класс, то надо самому написать преобразование типа. Можно просто пока сделать оператор чтения из потока.

std::istream & operator >>(std::istream & is , enum Operation & op){
  char ch ;
  is >> ch ;
  switch(ch){
  case '+' :
    op = Operation :: ADD ;
    return  is ;
  case '-' :
    op = Operation :: SUBSTRACT ;
    return  is ;
  case '*' :
    op = Operation :: MULTIPLY ;
    return  is ;
  case '/' :
    op = Operation :: DEVIDE ;
    return  is ;
  case '%' :
    op = Operation :: PERCENT ;
    return  is ;
  case '^' :
    op = Operation :: POWER ;
    return  is ;
  default:
    throw "operation not recognised" ;
  }
  return is;
}
→ Ссылка