用于 std 流的适配器

Adapter for std streams

提问人:max_hassen 提问时间:9/15/2015 更新时间:9/15/2015 访问量:848

问:

我的项目中有一个抽象类,它的导数用于输入/输出到不同的位置。 它具有读取写入的虚拟方法。

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,但不确定是哪些方法。

实现这一点的更好方法是什么?

C++ STL std IOstream StreamBuf

评论

0赞 NathanOliver 9/15/2015
用固有性和多态性重载“<<”的可能重复?

答:

0赞 2785528 9/15/2015 #1

我是 std::stringstream 的粉丝,也许你的班级可以使用它。

std::stringstream ss;

ss << "some output";

从中可以调用写入,例如:

write(ss.str().c_str(),  ss.str().size());

您必须弄清楚如何连接两者,但这具有提供所有流 io 的优点。

另一方面,直接实现操作员<<和>>并不太困难。

我想我应该重载 std::istream 和 std::ostream 或 std::streambuf,但不确定是哪种方法。

首先从您需要的方法开始,然后在确定需求时添加功能。

2赞 mattnewport 9/15/2015 #2

你可能想看看 boost iostreams 库。它提供了一个框架,可以更轻松地使用自定义源和接收器(输入和输出设备)定义 iostream。

4赞 fjardon 9/15/2015 #3

有很多简单但不灵活的方法可以做到这一点。这些解决方案中的大多数都不会利用 或 .例如,使操作员过载是一种方式。缺点是您必须为所有常用类型和所有标准操纵器等实现此运算符。它可能会成为一个巨大的负担。istreamostream<<

这是可悲的,因为整个事情只是解析格式化,而不是输入或输出。I/O 责任被赋予 .您的任务需要使用您的 和 方法的自定义实现。istreamostreamstreambufstreambufreadwrite

对于像 stackoverflow 答案这样的小格式来说,讨论太长了,但您可以在以下参考资料中找到很好的指导。

引用

注意

按照建议,使用 boost.iostreams 可能很合适,但我还不够了解。

评论

0赞 max_hassen 9/16/2015
谢谢。是的,自定义实现正是我所需要的。你的书很有帮助,很好地解释了工作原理。streambufstreambuf