如何在抽象类中使用流

时间:2018-09-21 15:11:41

标签: c++ file stream iostream

这似乎是一个意见问题,但我确实在寻找一些实现此目标的好方法。那是什么我基本上想拥有一个名为Repo的抽象类。此类将定义Repo应该具有的功能的抽象。在这种情况下,我只想能够保存一些内容,比如说您提供了名称和数据,并且应该为您存储它们。然后,我们可以使用FileRepository将它们保存在磁盘上,例如S3Repository可以将它们存储在AWS S3中,甚至可以将它们保存在内存中的MemoryRepository中。 >

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

我查看了适用于C ++的AWS开发工具包,似乎他们采用了带ostream的lambda,以便您可以编写内容。我试图在此处模仿类似的内容,以便您可以只传递istream或给出一个ostream并执行其内心所希望的lambda。

只是想知道是否有更好的方法?在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();
    });
  }
};

0 个答案:

没有答案