提问人:max_hassen 提问时间:9/15/2015 更新时间:9/15/2015 访问量:848
用于 std 流的适配器
Adapter for std streams
问:
我的项目中有一个抽象类,它的导数用于输入/输出到不同的位置。 它具有读取和写入的虚拟方法。
virtual unsigned read(void *buf, unsigned len) = 0;
virtual void write(const void *buf, unsigned len) = 0;
我需要一种 std 流(std::istream 和 std::ostream)和此类之间的适配器,以将输入/输出重定向到这些方法。
因此,例如,如果
mystream << "some output";
,它将调用 write 方法。
我想我应该重载 std::istream 和 std::ostream 或 std::streambuf,但不确定是哪些方法。
实现这一点的更好方法是什么?
答:
我是 std::stringstream 的粉丝,也许你的班级可以使用它。
std::stringstream ss;
ss << "some output";
从中可以调用写入,例如:
write(ss.str().c_str(), ss.str().size());
您必须弄清楚如何连接两者,但这具有提供所有流 io 的优点。
另一方面,直接实现操作员<<和>>并不太困难。
我想我应该重载 std::istream 和 std::ostream 或 std::streambuf,但不确定是哪种方法。
首先从您需要的方法开始,然后在确定需求时添加功能。
你可能想看看 boost iostreams 库。它提供了一个框架,可以更轻松地使用自定义源和接收器(输入和输出设备)定义 iostream。
有很多简单但不灵活的方法可以做到这一点。这些解决方案中的大多数都不会利用 或 .例如,使操作员过载是一种方式。缺点是您必须为所有常用类型和所有标准操纵器等实现此运算符。它可能会成为一个巨大的负担。istream
ostream
<<
这是可悲的,因为整个事情只是解析和格式化,而不是输入或输出。I/O 责任被赋予 .您的任务需要使用您的 和 方法的自定义实现。istream
ostream
streambuf
streambuf
read
write
对于像 stackoverflow 答案这样的小格式来说,讨论太长了,但您可以在以下参考资料中找到很好的指导。
引用
- http://www.mr-edd.co.uk/blog/beginners_guide_streambuf
- http://en.cppreference.com/w/cpp/io/basic_streambuf
- http://www.amazon.com/Standard-Library-Tutorial-Reference-2nd/dp/0321623215/ref=sr_1_1?ie=UTF8&qid=1442329302&sr=8-1&keywords=josuttis,本书有一章专门介绍 streambuf 的实现。
注意
按照建议,使用 boost.iostreams 可能很合适,但我还不够了解。
评论
streambuf
streambuf
评论