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

7

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

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++程序。 谢谢。

4
不建议公开继承STL类。为什么不能直接使用这个类呢? - Cody Gray
7
@Cody Gray所说的对于一些类是正确的。然而,streams和streambuf类是为通过继承来扩展而制作/准备的。 - wilx
@Cody:我正在开发一个库,需要派生出自己的流来替换一些STL流。 - Amir Saniyan
那并没有真正回答问题。你为什么需要派生自己的流来替换STL流呢?是的,wilx是正确的:stream和streambuf类实际上是为继承而设计的。但这相当复杂,很少有好的理由去这样做。你不需要派生自己的流只是为了使用自己的名称。 - Cody Gray
1
这不是STL流。STL包括容器库、算法库和迭代器,用于连接这两个库。IOStreams是完全独立的。我已经相应地编辑了问题。 - Billy ONeal
3个回答

15

我认为对于这个问题有三个层次的回答:

第一层:这很复杂,尤其是如果你完全不了解C++,请立即停止。只有当你想冒险时,才继续到第二层。

第二层:使用一些使创建流更容易的库。我建议使用Boost.IOStreams库。它可以使创建自己的流和streambufs变得更加容易。如果你仍然不满意,那么继续到第三层。

第三层:您需要从std::streambuf派生,并修改其行为以满足您的需求。然后您将需要将您的streambuf插入到自己的流中


6
这可能是正确的答案(除了一级:从std::streambuf导出真的不太困难)。但在我们知道他想要从std::stream派生出什么(以及为什么要从std::stream而不是std::istreamstd::ostream)之前,我们不能确定。另一个可能的解决方案是创建一个包含std::stream的类,具有模板operator<<operator>>,以将其转发给它。使用哪种解决方案取决于您要做什么。 - James Kanze
+1 -- 应当避免从流派生,而应该从 streambuf 派生。 - Billy ONeal
@BillyONeal:最终你需要两者。你从streambuf派生以使其工作,然后通常从stream派生以提供一种方便的实例化streambuf的方式。 - wilx

0

您能否详细描述一下您的streamclass应该做什么呢?仅仅询问“如何”而不涉及“什么”并不是获得建设性答案的最佳方式。

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


老实说,我不知道哪个STL类应该用作基类。 我想要一般流操作,比如读取、写入、寻址。 - Amir Saniyan
如果你真的想要搞砸它,你应该看看iosstreambuf类。 - Thomas Berger

-7

6
如果你要贬低iostreams,至少应该提供证据支持你的观点。如果无法提供证据,那么可以提供一种可替代的机制供他使用。 - Nicol Bolas
4
不实用,与原文主题无关。printf不是通用的函数,也无法进行扩展,因此无法满足基本要求。更不用说它不安全的类型转换了。 - Cat Plus Plus
1
提问者想要ABC而不是为什么XYZ更好的解释。那么你关于XYZ的主要观点是错误的。流具有更多,但承认是奇怪的功能,并且性能取决于实现。在我检查过的大多数编译器上,流速度更快。在msvc上,性能与您描述的相同。 - Sqeaky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接