出于教育目的,我想创建一个ostream和流缓冲区来执行:
我试过重载但是失败了。我试着通过
重载写入ostream& write( const char* s, streamsize n )
在我的basic_stringstream2类中(我复制了将basic_stringstream粘贴到我的cpp文件中并对其进行了修改)但代码保持使用basic_ostream。我查看了代码,看起来我需要重载xsputn(这个页面上没有提到http://www.cplusplus.com/reference/iostream/ostream)但是我还需要重载多少?以及如何构建我的类(它需要继承什么等)?
答案 0 :(得分:24)
规范方法包括定义自己的streambuf。 你应该看看:
答案 1 :(得分:6)
对于A + C)我认为你应该看一下方面,它们会修改对象作为字符的写法。您可以在此处存储统计信息以及流式传输对象的次数。 查看How to format my own objects when using STL streams?以获取示例。
对于B)您需要创建自己的streambuf并将ostream连接到该缓冲区(构造函数参数)。请参阅Luc's links + Deriving new streambuf classes。 简而言之,你需要为ostream(最小)实现这个:
答案 2 :(得分:1)
我不确定你想做什么是可能的。 <<
运算符不是虚拟的。因此,您可以定义yourstream &operator << (yourstream &strm, int i)
以使用endian转换和计数执行您想要的操作,并且当您的代码直接调用它时它将起作用。但是如果你将一个yourstream对象传递给一个需要ostream的函数,那么只要该函数调用<<
,它就会转到原来的ostream版本而不是你的版本。
据我了解,已经设置了流设施,以便您可以“轻松”定义使用不同类型缓冲区的新流类型(例如,字符的deque),并且您可以非常轻松地通过<<
添加对输出自己的类的支持。我不认为你打算重新定义它们之间的中间层。
特别是,<<
界面的整个要点是提供格式良好的文本输出,而听起来你真的想要二进制输出。 (否则对“endian”的引用毫无意义。)即使假设有一些方法可以做到这一点我不知道,它最多会产生笨拙的二进制输出。例如,考虑最终用户过载以在3D空间中输出点。 <<
的最终用户版本可能会执行<< '(' << x << ", " << y << ", " << z << ')'
之类的操作。这在文本流中看起来很不错,但是在二进制流中浪费了很多并且完全无用的字符,理想情况下只使用<< x << y << z
。 (对<<
的调用次数应该算多少?)