这似乎是一个意见问题,但我确实在寻找一些实现此目标的好方法。那是什么我基本上想拥有一个名为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();
});
}
};