Реализация простого входного потока

Я хочу написать простой объект istream, который просто преобразует другой istream.

Я хочу только реализовать readline (который будет читать строку из исходного потока, обрабатывать его и возвращать обработанную строку), и иметь некоторый общий код, который на read будет использовать мою строку чтения, кеш он и предоставить требуемое количество байтов в качестве вывода.

Есть ли класс, который позволил бы мне это сделать?

Например

struct mystream : istreamByReadLine {
  istream& s;
  mystream(istream& _s):s(_s){}
  virtual string getline() {
    string line;
    getline(s,line);
    f(line);
    return line;
  }
}

class istreamByReadLine : istream {
  ... // implementing everything needed to be istream compatible, using my
  ... // getline() virtual method
}

Ответ 1

Вы посмотрели boost. iostreams? Он выполняет большую часть работы для вас (возможно, не для вашего конкретного варианта использования, но для стандартных потоков библиотеки С++ в целом).

Ответ 2

Вы уверены, что это путь? В подобных случаях я либо определил класс (например, Line), с оператором >>, который сделал то, что я хотел, и прочитал это, например:

Line line
while ( source >> line ) ...

Сам класс может быть очень простым, только с помощью std::string член и функцию operator std::string() const, которая возвращает его. Вся работа по фильтрации будет проводиться в std::istream& operator>>( std::istream&, Line& dest ) функция. Или я установил фильтрацию streambuf перед normal streambuf  ; Boost iostream имеет хорошую поддержку для это.