Несколько дней назад я решил, что было бы интересно написать подкласс streambuf
, который будет использовать mmap
и упреждающее чтение.
Я посмотрел, как мой STL (SGI) реализовал filebuf
и понял, что basic_filebuf
содержит FILE*
. Так что наследование от basic_filebuf
исключено.
Итак, я унаследовал от basic_streambuf
. Затем я хотел связать свой mmapbuf
с ручьем.
Я думал, что единственное, что мне нужно будет сделать, - это скопировать неявный интерфейс filebuf
... но это была явная ошибка. В SGI basic_fstream
владеет basic_filebuf
. Неважно, если я вызову basic_filestream.std::::ios::rdbuf( streambuf* )
, файловый поток полностью игнорирует его и использует свой собственный filebuf
.
Так что теперь я немного запутался ... конечно, я могу создать свой собственный mmfstream
, который будет точной копией / вставкой fstream
, но на самом деле это звучит не DRY-ориентированным.
Что я не могу понять, так это: почему fstream
так тесно связан с filebuf
, что невозможно использовать что-либо еще, кроме filebuf
? Целое смысл разделения потоков и буферов состоит в том, что можно использовать поток с другим буфером.
Решения:
=> filestream
должен полагаться на неявный интерфейс filebuf
. То есть fstream должен быть настроен классом streambuf. Это позволило бы каждому предоставить свой собственный подкласс streambuf для fstream
, если он реализует неявный интерфейс filebuf
. Проблема: мы не можем добавить параметр шаблона в fstream
, так как он сломает селекторы шаблона при использовании fstream
в качестве параметра шаблона.
=> filebuf
должен быть чисто виртуальным классом без каких-либо дополнительных атрибутов. Так что от него можно унаследовать, не неся весь его ФАЙЛ * мусор.
Ваши идеи на эту тему?