Ответ 1
Вы посмотрели boost. iostreams? Он выполняет большую часть работы для вас (возможно, не для вашего конкретного варианта использования, но для стандартных потоков библиотеки С++ в целом).
Я хочу написать простой объект 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
}
Вы посмотрели boost. iostreams? Он выполняет большую часть работы для вас (возможно, не для вашего конкретного варианта использования, но для стандартных потоков библиотеки С++ в целом).
Вы уверены, что это путь? В подобных случаях я
либо определил класс (например, Line
), с оператором >>
, который
сделал то, что я хотел, и прочитал это, например:
Line line
while ( source >> line ) ...
Сам класс может быть очень простым, только с помощью std::string
член и функцию operator std::string() const
, которая
возвращает его. Вся работа по фильтрации будет проводиться в
std::istream& operator>>( std::istream&, Line& dest )
функция. Или я установил фильтрацию streambuf перед
normal streambuf
; Boost iostream имеет хорошую поддержку для
это.