4

我的项目中有一个抽象类,它的派生类用于不同位置的输入/输出。它有虚拟方法readwrite

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::istreamstd::ostreamstd::streambuf,但不确定哪些方法。

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

4

3 回答 3

4

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

这很可悲,因为整个事情只是解析istream格式化而不是输入或输出。将I/O责任交给. 并且您的任务需要使用您的和方法的自定义实现。ostreamstreambufstreambufreadwrite

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

参考

笔记

正如建议的那样,使用 boost.iostreams 可能很合适,但我不太了解。

于 2015-09-15T15:10:37.833 回答
2

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

于 2015-09-15T14:48:37.620 回答
0

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

std::stringstream ss;

ss << "some output";

从中可以调用 write ,例如:

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

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

另一方面,直接实现运算符 << 和 >> 并不太难。

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

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

于 2015-09-15T14:28:25.953 回答