我有一个对象(让我们称之为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
}
}发布于 2014-01-10 14:15:17
如果您只想复制对象,并获得一个指向新对象的共享指针,那么
bar = std::make_shared<Bar>(*bar);这假设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();您可能需要测试bar.unique()以确定副本是否必要。
发布于 2014-01-10 14:16:32
一般情况下是不可能的。可能有两种情况:
bar = std::make_shared<Bar>(*bar);bar = std::shared_ptr<Bar>(bar->Clone());发布于 2014-01-10 15:36:34
template<typename T>
std::shared_ptr<T>& cow_ptr( std::shared_ptr<T>& t ) {
if (t && !t.unique())
t = std::make_shared<T>( *t );
return t;
}给你写T的副本。这将切片t,如果它实际上不是一个T。
用途如下:
struct Foo
{
std::shared_ptr<Bar> bar;
void go()
{
cow_ptr(bar);
}
}您甚至可以直接使用它,比如cow_ptr(bar)->blah()。
cow代表“抄写”。cow_ptr代表"moo“。
https://stackoverflow.com/questions/21046377
复制相似问题