1

我有两个匹配的向量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. 推回一个带有空指针的空结构实例,用于 unique_ptr 并在向量中编辑它们一次。(繁琐的语法。我也不确定这是否可行)。

有什么想法会是另一种方法吗?或者为什么我应该更喜欢我列出的其中之一?

4

1 回答 1

1

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

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

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

于 2013-11-01T14:09:57.000 回答