次のようなモデル、メッシュなどを指す unique_ptrs のベクトルがあります。
std::vector<std::unique_ptr<Model>> mLoadedModels;
私が unique_ptr を選択したのは、ベクター デストラクタでデータが自動的に解放されるためです。また、後でたとえばすべてのモデルをリロードする必要がある場合 (OpenGL コンテキストの破棄/作成のため) は、リソース マネージャーで内部的に reset() を実行できるためです。新しい Model インスタンスを指すようにすると、システムの残りの部分には影響しません。
私の質問は、ベクターの内容を他のシステムとどのように共有しますか? unique_ptr を渡すだけでは所有権が変更されるため (unique_ptr が原因で)、rersource マネージャーに単独の所有権が必要です。
私が思いついた解決策は次のとおりです。次の構造体でアクセスをラップします。
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
それは少しギミックな気がしますが、確かにこれに対するより良い、より簡単な解決策はありますか?