【问题标题】:Adapter for std streams标准流适配器
【发布时间】:2015-12-11 20:19:01
【问题描述】:

我的项目中有一个抽象类,它的派生类用于不同位置的输入/输出。 它有虚方法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,但不确定哪些方法。

有什么更好的实现方式?

【问题讨论】:

标签: c++ stl std iostream streambuf


【解决方案1】:

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

这很可悲,因为 istreamostream 的全部内容只是 parseformat 不做输入或输出。 I/O 责任交给streambuf。您的任务需要自定义实现 streambuf,它使用您的 readwrite 方法。

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

参考文献

注意

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

【讨论】:

  • 谢谢。是的,streambuf 的自定义实现正是我所需要的。你的书非常有帮助,很好地解释了streambuf 的工作原理。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    std::stringstream ss;
    
    ss << "some output";
    

    其中一些东西会调用 write 像:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多