Можно, но нужно написать пользовательскую operator>>
перегрузку:
std::istream& operator>>(std;:istream& is, MyEnum& e) { ... }
Причина, по которой вы не можете сделать это с перегрузками std::istream
operator>>
по умолчанию, заключается в том, что аргумент правой стороны должен точно соответствовать параметру перегрузки оператора, поскольку он принимается неконстантной ссылкой (поскольку изменить объект, присвоив ему).
Другой вариант - извлечь целочисленное представление из потока в int
и затем привести его к типу перечисления:
int i;
MyEnum e;
if (!(std::cin >> i)) { /* handle error */ }
e = static_cast<MyEnum>(i);
Возможно, вы захотите выполнить здесь некоторую проверку ошибок, если только вы не уверены, что извлеченное значение может быть представлено MyEnum
. (Технически, вы также должны быть осторожны с извлечением в int
, так как int
может быть не в состоянии представить все значения MyEnum
. Существует объяснение того, как это сделать в ответе на другой вопрос, Как я могу расширить лексическое приведение для поддержки перечислимых типов? )