【发布时间】:2010-06-07 12:42:38
【问题描述】:
几天前,我决定编写一个使用mmap 并预读的streambuf 子类会很有趣。
我查看了我的 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 耦合得如此紧密,以至于除了filebuf 之外就无法使用其他任何东西?分离流和缓冲区的重点是可以使用具有不同缓冲区的流。
解决方案:
=> filestream 应该依赖于 filebuf 的隐式接口。也就是说,fstream 应该由 streambuf 类模板化。这将允许每个人都为fstream 提供自己的streambuf 子类,只要它实现filebuf 的隐式接口。问题:我们无法向fstream 添加模板参数,因为在使用fstream 作为模板模板参数时会破坏模板选择器。
=> filebuf 应该是一个没有任何附加属性的纯虚拟类。这样就可以继承它而不携带它所有的 FILE* 垃圾。
你对这个主题的想法?
【问题讨论】:
-
你的题目有错字;流错误 => 流缓冲区。不知道你的问题的答案,对不起!
标签: c++ stream fstream mmap streambuf