【发布时间】:2013-11-01 13:55:05
【问题描述】:
我有两个匹配向量 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 出现问题。解决此问题的最佳方法是什么?
我能想到的选项,其中一些我不确定是否可行:
- 只需切换到
shared_ptr。 (一个简单的查找替换,但感觉像是在逃避)。 - 为移动 unique_ptr 的结构编写移动构造函数。 (当我扩展结构时,要维护的另一件事可能会出错)。
- 为 unique_ptr 推回一个带有空指针的空结构实例,并在向量中就地编辑这些实例。 (繁琐的语法。我也不确定这是否可行)。
有什么想法是另一种方法吗?或者为什么我应该更喜欢我列出的其中之一?
【问题讨论】:
-
您认为您的代码会导致
unique_ptr出现什么问题? -
隐式移动构造函数应该没问题,除非您出于某种原因通过编写自己的复制构造函数将其杀死。无论如何,该类型必须是可移动的,因为
vector在重新分配时需要移动对象。 -
只是...移动它?或者更好的是,让自己成为一个像 boss 和 emplace_back 这样的构造函数。
-
@Oswald:不能复制,所以
push_back(d)会编译失败。 -
@MikeSeymour 啊哈!我认为我目前正在测试的编译器无法编写隐式移动构造函数(VC11)。见这里:stackoverflow.com/questions/10201659/…