我如何创build我自己的ostream / streambuf?

为了教育目的,我想创build一个ostream和stream缓冲区来做:

  1. 修正endians当做myVar;
  2. 存储在deque容器中,而不是使用std:cout或写入文件
  3. logging额外的数据,比如我做了多less次,我做了多less次.write,我写的字节数和flush()的次数。 但是我不需要所有的信息。

我尝试超载,但失败了。 我试图通过做超载写

ostream& write( const char* s, streamsize n ) 

在我的basic_stringstream2类(我复制粘贴basic_stringstream到我的cpp文件并修改它),但代码保持使用basic_ostream。 我查看了代码,它看起来像我需要重载xsputn(这是没有提到这个网页上http://www.cplusplus.com/reference/iostream/ostream ),但还有什么我需要超载? 以及如何构build我的类(它需要inheritance等)?

规范的方法在于定义你自己的streambuf。 你应该看看:

  • Angelika LAnger关于IOStreams派生的文章
  • James Kanze关于过滤streambufs 的文章
  • boost.iostream作为应用程序的例子

对于A + C),我认为你应该看看方面,他们修改如何将对象写成字符。 您可以在这里存储统计数据,也可以存储多less次stream式传输对象。 看看如何使用STLstream格式化我自己的对象? 举一个例子。

对于B)您需要创build自己的streambuf并将您的ostream连接到该缓冲区(构造函数参数)。 查看Luc的链接 + 派生新的streambuf类 。 总之你需要实现这个ostream(最小):

  • 溢出(把单个字符或清空缓冲区)( 链接 )
  • xsputn(把一个字符数组缓冲)( 链接 )
  • 同步( 链接 )

我不确定你想要做什么是可能的。 <<运营商不是虚拟的。 所以你可以定义yourstream &operator << (yourstream &strm, int i)来做你想要的endian转换和计数,当你的代码直接调用它的时候它就会工作。 但是,如果将一个yourstream对象传递给一个需要一个ostream的函数,那么当该函数调用<< ,它将转到原始的ostream版本,而不是你的。

据我了解,stream设施已经build立,以便您可以“轻松”定义一个新的streamtypes,使用不同types的缓冲区(比如说,一个chaque),你可以很容易地添加支持通过<<输出你自己的类。 我不认为你打算能够重新定义这些之间的中间层。

尤其是, <<接口的整个点是提供很好的格式化文本输出,而这听起来像你实际上想要二进制输出。 (否则,引用“endian”是没有意义的。)即使假设有一些这样做的方式,我不知道,它会产生最好的尴尬的二进制输出。 例如,考虑最终用户超载在三维空间中输出一个点。 <<的最终用户版本可能会做类似<< '(' << x << ", " << y << ", " << z << ')' 。 这在文本stream中看起来不错,但是在二进制stream中有很多浪费和完全无用的字符,理想的情况是使用<< x << y << z 。 (如果有那么几个电话打到?)