几天前,我决定编写一个streambuf
可以使用mmap
和预读的子类会很有趣。我查看了我的 STL (SGI) 如何实现filebuf
并意识到它basic_filebuf
包含一个FILE*
. 所以继承自是不可能basic_filebuf
的。
所以我继承自basic_streambuf
. 然后我想将我的绑定mmapbuf
到一个 fstream。
我认为我唯一要做的就是复制filebuf
...的隐式接口,但这是一个明显的错误。在 SGI 中,basic_fstream
拥有一个basic_filebuf
. 无论我是否调用basic_filestream.std::::ios::rdbuf( streambuf* )
,文件流都会完全忽略它并使用它自己的filebuf
.
所以现在我有点困惑......当然,我可以创建自己的mmfstream
,这将是精确的复制/粘贴,fstream
但听起来真的不是面向 DRY。
我无法理解的是:为什么这样fstream
做与 紧密耦合filebuf
,以至于除了 a 之外不能使用任何东西filebuf
?分离流和缓冲区的全部意义在于可以使用具有不同缓冲区的流。
解决方案:
=>filestream
应该依赖filebuf
. 也就是说, fstream 应该由 streambuf 类模板化。这将允许每个人都可以向 a 提供自己的 streambuf 子类,fstream
只要它实现了filebuf
的隐式接口。问题:我们无法添加模板参数,fstream
因为它会在fstream
用作模板模板参数时破坏模板选择器。
=>filebuf
应该是一个没有任何附加属性的纯虚拟类。这样人们就可以从它继承而不携带它所有的 FILE* 垃圾。
你对这个主题的想法?