几天前,我决定编写一个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* 垃圾。
你对这个主题的想法?