我正在为 CRI Middleware 的 ROFS 之类的视频游戏编写某种虚拟文件系统库(请参阅Wikipedia)。我使用库的目的是提供访问我开发的游戏资源的自然方式,其中存储了一些嵌入在可执行文件中的数据,一些在媒体上,一些在本地用户的硬盘驱动器上(首选项,保存游戏文件等) .
访问这些资源应该像拨打电话一样简单
std::auto_ptr<std::istream> defaultConfigIStream(
fslib.inputStream("self://defaultConfig.ini"));
std::auto_ptr<std::ostream> defaultConfigOStream(
fslib.outputStream("localappdata://config.ini"));
// Copies default configuration to local user's appdata folder
defaultConfigIStream >> defaultConfigOStream;
实际的做事方式实际上是不同的,另外一个抽象层用于后台加载,但这并不重要。
我想知道的是,考虑到与关联的被销毁时它不会被它删除,我怎么能返回它auto_ptr<>
(或者,你选择)。unique_ptr<>
std::streambuf<>
std::[i/o]stream<>
我正在考虑std::[i/o]stream<>
不承担在构造时传递给它的 streambuf 的所有权,因为构造函数不存在所有权语义的转移,并且 Apache 的 STDCXX 参考没有提到所有权的转移(我发现的任何 stdlib 参考也没有在网上)。
我有什么选择?我还不如返回一个共享指针并继续观察它,直到 FSlib 管理器保留共享指针的唯一副本,在这种情况下,它会破坏其唯一副本以及 streambuf。考虑到图书馆的组织模型,这是很实用的,但这不是很优雅,也不是很有效。
我试过看一下 Boost.Iostreams,但对我来说,情况似乎更糟,因为流本身的设备类型与其类型密切相关(流的设备必须在其模板参数中定义)。这个问题似乎使我的库无法使用 Boost.Iostreams,因为它需要抽象出流的具体“源/接收器”实现,以便可以无缝地使用流来打开位于可执行文件本身内部的文件,例如,在系统文件系统的文件中或归档类型文件中。
我可以编写一个容器类来处理这些问题,但我宁愿做得更干净(即已经返回流;这就是它应该需要的全部!;)。
建议?