У меня есть вектор 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
Это кажется немного бесполезным, конечно, есть лучшее, более простое решение для этого?
shared_ptr
, если вам нужно совместное владение. Затем вы можете раздатьweak_ptr
s наблюдателям. - person Praetorian   schedule 19.07.2013Handle
, очевидно, следует назватьunique_ptr_ptr
. Шутки в сторону, вашHandle
будет аннулирован при изменении размера вектора. - person Casey   schedule 19.07.2013Model*
? - person Igor Tandetnik   schedule 19.07.2013shared_unique_ptr
для решения жизненных проблем (я шучу). - person Yakk - Adam Nevraumont   schedule 19.07.2013shared_unique_ptr*
, чтобы охватить все мои базы. - person Casey   schedule 19.07.2013shared_unique_ptr*&
чтобы быть в безопасности. - person Yakk - Adam Nevraumont   schedule 19.07.2013std::bind
.reference_wrapper<shared_unique_ptr*>
гораздо более гибкий. - person Casey   schedule 19.07.2013