包含unique_ptr的unordered_map的对象的深层副本

时间:2018-04-08 15:40:05

标签: c++ copy smart-pointers unique-ptr deep-copy

我有以下情况:

我需要从类型A创建变量的深(!)副本。此变量包含B类型的向量。类B不可复制,因为它包含std::unordered_map,其值为unique_ptr(不可复制)。我想避免通过复制构造函数或复制赋值运算符复制B

一个问题是unique_ptr的类型只是基本类型。实际对象派生自C并包含不同的成员并具有不同的构造函数。

class A{
public:
    A(const A&);            // how should I implement this?
    A& operator=(const A&); // how should I implement this?
private:
    vector<B> vectorOfB;
}

class B{
private:
    std::unordered_map<std::string, std::unique_ptr<C> mapOfDerivedTypesOfC;
}

class C{}

class C_1: public C{
public:
    C_1(double x)
}

class C_2: public C{    
public:
    C_2(double y, double z)
}

背景: A类的目的是读取大量带有数据的大型文本文件并创建许多对象。 之后我必须用这个对象运行monte-carlo模拟。对于每个模拟,我需要A的新副本。 我不想每次都阅读所有文本文件,因为它很耗时。因此,有必要制作A的深层副本。在一次模拟中,我想避免复制B,因为它不会复制此对象。我认为使用sharded_ptr无济于事,因为我需要一个深层复制,并且模拟使用openMP并行运行。

编辑: 我认为整体问题是我应该如何复制unordered_map

2 个答案:

答案 0 :(得分:2)

我认为这种技术被称为“虚拟拷贝构造函数”:

// in baseclass
public:
unique_ptr<Base> clone() const
{
    unique_ptr<Base> other(this->do_clone());
    assert(typeid(*this) == typeid(*other));
    return other;
}
private:
virtual Base* do_clone() const = 0;

// in derived class
private:
virtual Derived* do_clone() const
{
    return new Derived(*this);
}

这个想法是一个类型最终有信息如何克隆自己的实例,所以你通过虚函数委托克隆它。断言确保派生类正确实现/覆盖基类实现。

答案 1 :(得分:1)

长话短说,您需要在C中为每个继承类编写一个虚函数来覆盖。像

这样的东西
virtual std::unique_ptr<C> anotherOnePlease() = 0;

然后您可以在每个C *上使用此功能,并创建一个新地图。有点糟糕,但如果你为每个派生的C实现这个功能,至少可以写一个简单的复制地图的功能。