包含 unordered_map of unique_ptr 对象的深拷贝

deep copy of objects containing unordered_map of unique_ptr

我有以下情况:

我需要从类型 A 创建变量的深 (!) 副本。此变量包含类型 B 的向量。 Class 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)
}

背景: class A 的目的是读取大量带有数据的大型文本文件并创建许多对象。 之后我必须 运行 对这个对象进行蒙特卡洛模拟。对于每个模拟,我都需要 A 的新副本。 我不想每次都读入所有的文本文件,因为这很耗时。因此,有必要对 A 进行深度复制。在一次模拟中,我想避免复制 B,因为复制此对象毫无意义。我认为使用 sharded_ptr 无济于事,因为我需要深度复制和使用 openMP 并行模拟 运行。

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

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

virtual std::unique_ptr<C> anotherOnePlease() = 0;

然后你可以在每个C *上使用这个函数,并创建一个新地图。有点糟糕,但是如果你为每个派生 C.

实现这个函数,至少你可以编写一个简单的函数来复制地图

我认为该技术被称为 "virtual copy constructor":

// 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);
}

这个想法是,一个类型最终拥有如何克隆其自身实例的信息,因此您可以通过虚函数将克隆委托给它。该断言确保派生的 class 正确地 implements/overrides baseclass 实现。