std :: cin экстракт для перечисления - PullRequest
2 голосов
/ 26 января 2011

Я не понимаю, почему я не могу к этому:

enum MyEnum {X=1, Y};
...
X x;
std::cin >> x;

проблема в том, что C ++ не умен, или я что-то ошибаюсь?

1 Ответ

4 голосов
/ 26 января 2011

Можно, но нужно написать пользовательскую 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. Существует объяснение того, как это сделать в ответе на другой вопрос, Как я могу расширить лексическое приведение для поддержки перечислимых типов? )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...