gpt4 book ai didi

c++ - 使用 variant + reference_wrapper + unique_ptr 表达(非)拥有资源的想法

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:38 26 4
gpt4 key购买 nike

如果我需要表达这样的想法:有一个场景节点(带有转换)可以指向(不拥有)几何体(例如网格),但有时节点拥有几何图形非常方便。这样表达这个想法可以吗?如果没有 - 您能否就如何表达这个想法提出一些想法?

struct Node
{
variant<reference_wrapper<SceneObject>, unique_ptr<SceneObject>> sceneObject{nullptr};
};

Node node1;
node1.sceneObject = make_unique<Mesh>(); // node is responsible for the life of the mesh

Node node2;
node2.sceneObject = sceneObjectDatabase.getResource("myMesh"); //the node does not own the mesh, but simply references it

Node node3;
node3.sceneObject = nullptr; // doesn't own any geometry

最佳答案

不要在这里使用变体。你没有不同的类型,你只有一种类型——但只有那种类型的属性。所以你可以只写一个可能拥有的类型,它基本上是一个 T* 和一个 bool:

template <typename T>
class maybe_owning_ptr {
T* ptr_;
bool owns_;

public:
maybe_owning_ptr() : ptr_(nullptr), owns_(false) { }
maybe_owning_ptr(T* p, bool owns) : ptr_(p), owns_(owns) { }
~maybe_owning_ptr() {
if (owns_) delete ptr_;
}

maybe_owning_ptr(maybe_owning_ptr&& rhs) noexcept
: ptr_(std::exchange(rhs.ptr_, nullptr))
, owns_(std::exchange(rhs.owns_, false))
{ }

maybe_owning_ptr& operator=(maybe_owning_ptr&& rhs) noexcept
{
T* p = std::exchange(rhs.ptr_, nullptr);
bool o = std::exchange(rhs.owns_, false);

if (owns_) delete ptr_;
ptr_ = p;
owns_ = o;
return *this;
}

// accessors here... get(), operator*, operator->(), etc.
};

请注意,我们不能拥有复制构​​造函数 - 因为我们不知道在我们确实拥有所有权的情况下该做什么。

一直想用std::exchange()为了某事...

关于c++ - 使用 variant + reference_wrapper + unique_ptr 表达(非)拥有资源的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48075020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com