Обработка неверного ввода в операторе потока ввода >> - PullRequest
4 голосов
/ 22 октября 2019

Каков рекомендуемый (стандартный) способ обработки неверного ввода в операторе извлечения:

std::istream& operator>>(std::istream& is, SomeType& val) {
    // ...
    return is;
}

Должно ли оно установить std::ios_base::failbit и немедленно вернуться? Можно ли оставить объект val в неопределенном состоянии, возможно, некоторые его переменные уже изменены?

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Согласно FormattedInputFunction документации рекомендуемая раскладка:

std::istream& operator>>(std::istream& is, SomeType& val) {
    std::istream::sentry s(is);
    if (s) {
         // do parse
         if (parsing_failed) {
             // optionally, to make it work like built-in operators:
             // val = {};
             is.setstate(std::ios_base::failbit);
         }
    }
    return is;
}
0 голосов
/ 23 октября 2019

Я бы следовал соглашению стандартной библиотеки - то есть, установил failbit, оставил бы поток, указывающий на то же место, с которого вы начали, и установил для вашего ввода какое-то значение по умолчанию - стандартная библиотека установит входные данные для 0в случае ошибки, поэтому сделайте любой логический эквивалент этого для вашего типа, вероятно val = SomeType{};.

...