适用于标准流的适配器

时间:2015-09-15 14:14:27

标签: c++ stl std iostream streambuf

我的项目中有一个抽象类,它的衍生产品用于输入/输出到不同的位置。 它有虚拟方法 read write

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

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

3 个答案:

答案 0 :(得分:4)

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

这很难过,因为关于istreamostream的整个事情只是解析格式不做输入或输出。 I / O 职责赋予streambuf。您的任务需要streambuf的自定义实施,该实施使用您的readwrite方法。

对于像stackoverflow这样的小格式,讨论太长了,但你可以在以下参考文献中找到好的指针。

<强>参考

注意

根据建议,使用boost.iostreams可能非常适合,但我不太了解。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

std::stringstream ss;

ss << "some output";

从中可以调用类似的内容:

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

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

另一方面,直接实现运算符&lt;&lt;和&gt;&gt;并不太难。

  

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

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