C ++: std :: istream проверка EOF без чтения / потребления токенов / использования оператора >>

Я хотел бы проверить, достиг ли std :: istream конца, не читая его.

Я знаю, что могу проверить EOF следующим образом:

if (is >> something) 

но здесь есть ряд проблем. Представьте, что существует много, возможно виртуальных, методов / функций, которые ожидают, что std :: istream & передан в качестве аргумента.

Я знаю, что могу проверить EOF следующим образом:

if (is >> something) 

, но здесь есть ряд проблем. Представьте, что существует много, возможно виртуальных, методов / функций, которые ожидают, что std :: istream & передан в качестве аргумента.

Я знаю, что могу проверить EOF следующим образом:

if (is >> something) 

, но здесь есть ряд проблем. Представьте, что существует много, возможно виртуальных, методов / функций, которые ожидают, что std :: istream & передан в качестве аргумента. Это означало бы, что я должен выполнить «домашнюю работу» по проверке EOF в каждом из них, возможно, с другим типом переменной something , или создать какую-то странную оболочку, которая обрабатывала бы сценарий вызова методов ввода.

Все, что мне нужно сделать, это:

if (!IsEof(is)) Input(is);

метод IsEof должен гарантировать, что поток не будет изменен для чтения, так что приведенная выше строка эквивалентна:

Input(is)

в отношении прочитанных данных в методе Input .

Если нет универсального решения, которое означало бы и std :: istream , есть ли способ сделать это для std :: ifstream или cin ?

РЕДАКТИРОВАТЬ: Другими словами, следующее assert всегда должно проходить:

while (!IsEof(is)) {
  int something;
  assert(is >> something);
}
5
задан Sam 26 June 2014 в 08:00
поделиться