如何在抽象类中使用流

How to use streams in abstract classes

提问人:Peyman 提问时间:9/21/2018 最后编辑:Peyman 更新时间:9/21/2018 访问量:252

问:

这似乎是一个意见问题,但我真的在寻找一些好方法来做到这一点。那这是什么?我基本上想要一个名为 us-say 的抽象类。这个类将定义一个应该能够做什么的抽象。在这种情况下,我只想能够保存一些东西,比如说你提供了一个名字和数据,它应该为你存储它。然后,我们可以将它们保存在光盘上,例如将它们存储在 AWS S3 中,甚至将它们保存在内存中。RepoRepoFileRepositoryS3RepositoryMemoryRepository

太好了,但是我该如何抽象出来呢?显然我可以获取字节,并且每个派生类都会使用自己的流来保存它,但是如果数据很大并且我们不想将其加载到内存中怎么办?假设我们想保存一个 5GB 的文件,我们不想将其加载到内存中。

我查看了适用于 C++ 的 AWS 开发工具包,似乎他们采用了带有 ostream 的 lambda,因此您可以编写内容。我试图在这里模仿类似的东西,这样你就可以直接传递你的 ,或者给出一个 lambda 来做一个它心里想做的任何事情。istreamostream

只是想知道是否有更好的方法?在 C++ 中通常很难找到好的实践,因为有十亿种方法可以做同样的事情,而许多人做事的方式却截然不同。我只是想在这里获得一些见解。我对C++相当陌生,所以一个好的解释将不胜感激。

class Repo {
public:
  virtual void add_with_ostream(const string& name, const std::function<void (ostream&)>& f) = 0;

  template<typename T>
  void add(const string& name, const T& data) {
    this->add_with_ostream(name, [&data](ostream& output_stream) {
      output_stream << data;
    });
  }

  virtual void add_with_istream(const string&name, const istream& input_stream) {
    this->add_with_ostream(name, [&input_stream](ostream& output_stream) {
      output_stream << input_stream.rdbuf();
    });
  }
};
C++ 文件 IOSTREAM

评论

2赞 Sam Varshavchik 9/21/2018
描述中没有任何内容要求使用模板。根据给定的描述,并且应该是 的简单子类。这就是子类的用途。FileRepositoryMemoryRepositoryRepo
0赞 Peyman 9/21/2018
@Sam Varshavchik 我理解这一点,我更想知道抽象类是否设计得当。我拥有的模板只是为了能够捕获不同类型的类型,如 int、string 等,它只会通过管道传输到输出流。
0赞 Sam Varshavchik 9/21/2018
当然不是。如果这个类应该有一个子类,它处理与基于文件的存储相关的所有事情,那么抽象类应该与任何 无关,如下所示。这是子类的工作。FileRepositorystd::ostream
0赞 Martin York 9/21/2018
你想做什么?序列化/反序列化对象?
0赞 Peyman 9/21/2018
我以为是输出流的基类。那么抽象类应该使用什么类型呢?因为抽象类仍然需要提供方法,所以我们需要知道要拿什么作为输入参数。我的想法是,例如,将实现并传递文件流,并且将使用字符串流。抽象只会提供一些帮助程序方法,但它们都依赖于派生类必须提供的东西。ostreamFileRepositoryadd_with_ostreamostreamMemoryRepoadd_with_ostream

答: 暂无答案