我怎么创造我自己的ostream/streambuf?
题
对于教育目的,我想创建一个ostream和流缓冲区这样做:
- 修复endians当做 << myVar:;
- 存储在一个双端的容器,而不是使用std:状或书面文件
- 日志的额外数据,例如有多少次我没有 <<多少次我没有。写量字节我写了多少次我flush().但我不需要的所有信息。
我试图超载,但失败的可怕.我试图过载写这样做
ostream& write( const char* s, streamsize n )
在我basic_stringstream2类(I复制贴basic_stringstream到我的加拿大养恤金计划的文件和修改),但代码保持使用basic_ostream.我看过代码,它看起来像我需要超载xsputn(这是不是说在这个页面 http://www.cplusplus.com/reference/iostream/ostream ),但还有什么我需要超载?和我如何构建我的等级(这是什么需要继承等)?
解决方案
规范的做法包括在定义自己的streambuf.你应该看看:
- Angelika LAnger的文章 在IOStreams推导
- 詹姆斯观世的文章 在过滤streambufs
- 提升。法师 为实例应用
其他提示
为+C)我认为你应该看看方面,他们修改对象是写字。你可以保存统计数据在这里以及在多少次你流你的对象。检查了 如何格式我自己的对象时使用STL流? 对于一个例子。
B)你需要创建你自己的streambuf和连接你的ostream到,缓冲区(constructor个参数)。看看 吕克的链接 + 出新的streambuf类.在短期需要实现这一ostream(最少):
我不知道你想要做什么是可能的。的 <<
运营商不是虚拟的。所以你可以定义 yourstream &operator << (yourstream &strm, int i)
做什么你想要的endian转换和计数,并将工作时,你的代码通话。但如果你通过一yourstream象成一个函数,预计ostream,任何时候功能的电话 <<
, 它将原ostream版本,而不是你的。
我的理解是,流的设施已经设立了这样,你可以"轻松地"定义的一种新的流类型使用一种不同的缓冲区(像,也就是说,一个双端的chars),并且可以很容易地增加支持,用于输出自己的类通过 <<
.我不认为你是旨在能够重新定义的中间层之间的那些。
特别是,整个点的 <<
接口,以提供很好的格式的文本的输出,虽然这听起来像你真的想二进制的输出。(否则的参考"endian"没有任何意义。) 即使假设有一些这样做的方法我不知道,这会产生尴尬的二进制输出最好的。例如,考虑最终用户过载于输出一点在3D空间。终端用户的版本 <<
可能会做这样的事情 << '(' << x << ", " << y << ", " << z << ')'
.这看起来不错在一个文本流,但这是一个很大的浪费,并完全无用的人物,在一个二流,这最好只使用 << x << y << z
.(及有多少电话来 <<
应该为那些最为?)