从streambuf派生而不重写相应的流

New*_*biZ 4 c++ fstream mmap stream streambuf

几天前,我决定编写一个streambuf使用mmap和预读的子类会很有趣.我看了一下我的STL(SGI)如何实现filebuf和实现basic_filebuf包含a 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分离流和bufs的关键在于可以使用具有不同缓冲区的流.

解决方案:

=> filestream应该依赖于隐式接口filebuf.也就是说,fstream应该由streambuf类进行模板化.这将允许每个人提供自己的streambuf子类,fstream只要它实现了filebuf隐式接口.问题:我们无法添加模板参数,fstream因为它会在fstream用作模板模板参数时破坏模板选择器.

=> filebuf应该是一个没有任何附加属性的纯虚拟类.这样一个人就可以从中继承而不携带所有的FILE*垃圾.

你对这个问题的想法?

sbi*_*sbi 11

在IO流的设计,最实际的流的功能(相对于流缓冲器功能)被实现在std::basic_istream,std::basic_ostream和它们的基类.字符串和文件流类或多或少只是便利包装器,它确保实例化具有正确类型缓冲区的流.

如果要扩展流,您几乎总是希望提供自己的流缓冲类,并且几乎不需要提供自己的流类..

一旦拥有了自己的流缓冲区类型,就可以使它成为您碰巧遇到的任何流对象的缓冲区.或者从std::basic_istream,派生自己的类std::basic_ostream,并std::basic_iostream实例化您的流缓冲区并将其传递给它们的基类.
后者对用户来说更方便,但是需要你为缓冲区的实例化编写一些样板代码(即流类的构造函数).

回答你的问题:文件流和文件缓冲区的连接非常紧密,因为前者仅用于简化后者的创建.使用文件流可以轻松设置所有内容.
使用您自己的流类来包装自己的流缓冲区的构造应该不是问题,因为您不应该传递文件流,而只是(引用)基类.

  • 因为你没有回答这个问题.这里写的任何内容都无助于解决问题.这就像你在对自己说话,回答一个想象中的"iostream和streambuf之间有什么区别"的问题...... (3认同)