我有一个对象(让我们称之为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()以确定是否需要该副本.