我的项目中有一个抽象类,它的衍生产品用于输入/输出到不同的位置。 它有虚拟方法 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 ,但不确定哪些方法。
实现这个的更好方法是什么?
答案 0 :(得分:4)
有很多简单的但不是灵活的方法。这些解决方案中的大多数都不会使用istream
或ostream
。例如,重载<<
运算符是一种方法。缺点是您必须为所有常用类型和所有标准操纵器实现此运算符,依此类推。这可能会成为一个很大的负担。
这很难过,因为关于istream
和ostream
的整个事情只是解析和格式不做输入或输出。 I / O 职责赋予streambuf
。您的任务需要streambuf
的自定义实施,该实施使用您的read
和write
方法。
对于像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,但不确定哪种方法。
首先使用您需要的方法,然后在确定要求时添加功能。