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