将包含unique_ptr的结构项添加到stl容器

时间:2013-11-01 13:55:05

标签: c++ c++11 vector struct

我有两个匹配的unique_ptr向量。我决定通过制作一个包含两个unique_ptr的结构的向量来统一它们(结构也将包含其他项,最终,因此这个重构)。

在此向量中添加新项目的最佳方法是什么?

我目前的代码是

std::vector<DestinationObjects> destinations;
for (unsigned short &id: ids) {
    DestinationObjects d;

    d.transmitter = unique_ptr<Transmitter> (new Transmitter(id));
    d.controller = unique_ptr<Controller> (new Controller(id));

    destinations.push_back(d);
}

当然,这会复制d,导致unique_ptr出现问题。解决这个问题的最佳方法是什么?

我可以想到的选项,其中一些我不确定会起作用:

  1. 只需切换到shared_ptr即可。 (一个简单的发现 - 替换,但感觉就像一个警察出局)。
  2. 为移动unique_ptr的结构写一个移动构造函数。 (另外一件事可能会出错,因为我扩展了结构)。
  3. 使用null指针推回一个空的struct实例,用于unique_ptr,并在向量中对其进行一次编辑。 (粗鲁的语法。我也不确定这甚至会起作用。)
  4. 任何想法会是另一种方法吗?或者为什么我更喜欢我列出的那个?

1 个答案:

答案 0 :(得分:1)

简单做vec.emplace_back( std::move(d) )

如果(如您的评论中所述)您的编译器没有实现隐式移动构造函数,请编写您自己的move构造函数。我对未来的建议是,每当你遇到任何C ++ 11特性的问题并且提出一个问题,提到你正在使用这个编译器,因为很有可能它是“C ++ 11支持”将是一个重要的问题。

如果您的编译器根本不支持任何移动构造函数,请停止使用unique_ptr - 如果没有move构造函数,它们将毫无用处。 ;)