std :: shared_ptr的唯一副本

Ale*_*son 5 c++ c++11

我有一个对象(让我们称之为X),可以通过其他对象访问std::shared_ptr.但是,在某些时候,这些对象需要创建一个唯一的非共享X副本,因为它想要修改它.这在某种程度上类似于写时复制,但由于其他一些细节而不完全相同.

基本上我想有这样的语义:

struct Foo
{
  std::shared_ptr<Bar> bar;
  void go()
  {
    // bar.use_count() >= 1
    bar.make_this_object_unique();
    // bar.use_count() == 1
  }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 12

如果你只是想复制对象,并获得一个指向新对象的共享指针,那就是

bar = std::make_shared<Bar>(*bar);
Run Code Online (Sandbox Code Playgroud)

这假定这Bar是目标的实际类型.如果要复制任意子类Bar,则需要一个虚函数来复制对象,例如:

struct Bar {
    virtual std::shared_ptr<Bar> clone() = 0;
};

struct SomeKindOfBar : Bar {
    virtual std::shared_ptr<Bar> clone() {
        return std::make_shared<SomeKindOfBar>(*this);
    }
};

bar = bar->clone();
Run Code Online (Sandbox Code Playgroud)

您可能希望进行测试bar.unique()以确定是否需要该副本.