vector <unique_ptr>的唯一副本

时间:2016-01-14 19:15:16

标签: c++ vector copy unique-ptr

我有一个包含AWSS3TransferUtilityExpression的类对象。我想要一个这个对象的副本来运行非const函数。原始副本必须保持 const

这样一个类的复制构造函数会是什么样的?

vector<unique_ptr>

2 个答案:

答案 0 :(得分:9)

您不能简单地复制std::vector<std::unique_ptr>,因为std::unique_ptr不可复制,因此会删除矢量复制构造函数。

如果你不改变存储在矢量中的类型,你可以通过创建一个像

这样的全新矢量来制作“副本”。
std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to

for (const auto& e : from)
    to.push_back(std::make_unique<some_type>(*e));

现在tofrom的单独副本,可以单独更改。

另外:如果你的类型是多态的,那么上面的代码将无效,就像你有一个指向基类的指针一样。您需要做的是创建一个虚拟clone成员函数,并让clonestd::unique_ptr返回给实际派生对象的副本。这将使代码看起来像:

std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to

for (const auto& e : from)
    to.push_back(e->clone());

答案 1 :(得分:-1)

Nathan的回答非常棒。另外,在多态情况下,我发现this site对于定义clone()成员函数很有用。

我用过

/// <summary>
/// Version record
/// </summary>
/// <param name="Major">Major constructor parameter</param>
/// <param name="Minor">Minor constructor paramater</param>
public record Version(int Major, int Minor)
{
    /// <summary>
    /// Major Property
    /// </summary>
    public int Major { get; init; } = Major;

    /// <summary>
    /// Minor property
    /// </summary>
    public int Minor { get; init; } = Minor;
}

与Nathan的后来评论类似。