我有一个指向模型、网格等的 unique_ptrs 向量,如下所示:
std::vector<std::unique_ptr<Model>> mLoadedModels;
我选择 unique_ptr 是因为它会在矢量析构函数时自动释放数据,并且还因为稍后如果我需要重新加载所有模型(由于 OpenGL 上下文拆除/创建),我可以在资源管理器内部 reset() 和让它指向一个新的模型实例,它不会影响系统的其余部分。
不过我的问题是,您将如何与其他系统共享向量的内容?你不能只传递 unique_ptr,因为这会改变所有权(由于它的 unique_ptr),我想要资源管理器中的唯一所有权。
我想出的解决方案如下,将访问包装在以下结构中:
template<typename T>
struct Handle
{
Handle(std::unique_ptr<T>& resource) : mResource(resource)
{
}
T& operator*() { return mResource.get(); }
const T& operator*() const { return mResource.get(); }
T* operator->() { return mResource.get(); }
const T* operator->() const { return mResource.get(); }
private:
std::unique_ptr<T>& mResource;
};
typedef Handle<Model> ModelPtr;
ModelPtr GetModel(const std::string& modelName);
// example:
ModelPtr monkey = GetModel("Monkey");
monkey->dance();
// reload resources, and then monkey dereferences to the new Model instance
虽然感觉有点花哨,但肯定有更好,更直接的解决方案吗?