Как использовать потоки в абстрактных классах - PullRequest
0 голосов
/ 21 сентября 2018

Это может показаться мнением, но я действительно ищу хорошие способы сделать это.так что это?Я в основном хочу иметь абстрактный класс с именем Repo скажем.Этот класс определит абстракцию для того, что Repo должен уметь делать.В этом случае я просто хочу иметь возможность что-то сохранить, скажем, вы предоставляете имя и данные, и он должен хранить их для вас.Тогда у нас может быть FileRepository, который будет сохранять их на диске, S3Repository, например, для их хранения в AWS S3, или даже MemoryRepository, где мы просто сохраняем их в памяти.

Отлично,но как мне абстрагироваться?очевидно, я мог получить байты, и каждый производный класс использовал бы свой собственный поток для его сохранения, но что, если данные велики, и мы не хотим загружать их в память?скажем, мы хотим сохранить файл 5 ГБ, мы не хотим загружать его в память.

Я посмотрел на AWS SDK для C ++, и кажется, что они берут лямбду с ostream в немтак что вы можете написать контент.Я попытался воспроизвести что-то подобное здесь, чтобы вы могли либо просто передать свой istream, либо дать лямбду, которая берет ostream и делает все, что душе угодно.

Просто интересно, есть ли лучший способза это?часто трудно найти хорошие практики в 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();
    });
  }
};
...