【问题标题】:How can I derive my own stream from a standard stream?如何从标准流派生我自己的流?
【发布时间】:2011-06-27 08:51:27
【问题描述】:

如何从标准流派生我自己的流?

C#语言中有Stream类,但是C++的流太复杂了。

我想要这样的东西:

class my_stream : public std::stream
{
  // How to derive?
};

void using_a_stream(std::stream* s)
{
  *s << "Hello world";
}

void main()
{
  std::stream s1;
  std::fstream s2("C:\\test.txt");
  my_stream s3;

  using_a_stream(&s1);
  using_a_stream(&s2);
  using_a_stream(&s3);
}

注意:代码只是一个示例,可能是无效的 C++ 程序。 谢谢。

【问题讨论】:

  • 强烈建议不要公开继承自 STL 类。为什么不能按原样使用该类?
  • @Cody Gray:你所说的对于某些课程是正确的。然而,流和 streambuf 类是通过继承来扩展的。
  • @Cody:我开发了一个库,我应该派生自己的流来替换一些 STL 流。
  • 这实际上并没有回答问题。 为什么您需要派生自己的流来替换 STL 流?是的,wilx 是对的:stream 和 streambuf 类实际上是为继承而设计的。但这相当复杂,而且很少有充分的理由。您不需要派生自己的流,因此它使用您自己的名称。
  • 它不是 STL 流。 STL 包括容器库、算法库和迭代器,用于连接这两个库。 IOStreams 是完全独立的。我已经相应地编辑了问题。

标签: c++ iostream


【解决方案1】:

我认为这个问题的答案分为三个层次:

第 1 级:这很复杂,尤其是如果您对 C++ 完全陌生,请立即停止。仅当您喜欢冒险时,才继续进行第 2 级。

第 2 级:使用一些可以更轻松地创建流的库。我建议使用Boost.IOStreams 库。它使创建自己的流和流缓冲区变得更加容易。如果您仍然不满意,请继续第 3 级。

第 3 级:您必须从 std::streambuf 派生并修改其行为以满足您的需要。然后你必须plug your streambuf into own stream

【讨论】:

  • 这可能是正确的答案(除了1级:从std::streambuf推导出来真的不是很困难)。但在我们知道他为什么要从std::stream(以及为什么从std::stream,而不是std::istreamstd::ostream)派生之前,我们无法确定。另一种可能的解决方案是包含std::stream 的类,模板operator&lt;&lt;operator&gt;&gt; 转发给它。使用哪种解决方案取决于您要执行的操作。
  • +1 -- 一个不应该真正从流派生,一个应该从流缓冲区派生。
  • @BillyONeal:最后你需要两者。您从 streambuf 派生以使事情正常工作,然后您通常从 stream 派生以提供一种方便的方式来实例化您的 streambuf
【解决方案2】:

您能否再描述一下您拥有的流类应该做什么? 只问how 而没有what 并不是获得建设性答案的最佳方式。

也许你应该看看boost::iostream,因为有一种更简单、更安全的方法来编写自己的iostream 类。

【讨论】:

  • 老实说,我不知道应该使用哪个 STL 类作为基类。我想要一般的流媒体,比如读、写、搜索。
  • 如果你真的想搞砸,你应该看看 iosstreambuf 类。
【解决方案3】:

【讨论】:

  • -1:如果您要诋毁 iostream,您至少可以为您的断言提供证据。或者如果做不到这一点,请提供他可以使用的替代机制。
  • -1。对OP没有用或真正相关。 printf 不是通用的,你根本不能扩展它——所以它不符合基本要求。更不用说它的类型不安全了。
  • -1。 Asker 想要 ABC 而不是解释为什么 XYZ 更好。那么你关于 XYZ 的主要观点是错误的。 Streams 有更多,但很奇怪的是,特性和性能取决于实现。在我检查过的大多数编译器上,流更快。在 msvc 上的性能如您所描述。
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 2022-12-12
  • 2016-03-07
  • 2019-08-06
  • 2011-02-28
  • 1970-01-01
  • 2017-11-02
  • 2021-05-30
相关资源
最近更新 更多