【发布时间】:2016-01-07 08:18:55
【问题描述】:
我有一个 unique_ptrs 的向量,想将它过滤成一个相同类型的新向量。
vector<unique_ptr<Thing>> filter_things(const vector<unique_ptr<Thing>> &things) {
vector<unique_ptr<Thing>> things;
// i want the above line to be something like: vector<const unique_ptr<Thing> &>
// but I don't think this is valid
for (const unique_ptr<Thing> &thing : things) {
if (check(thing)) {
filtered.push_back(thing); // this part shouldn't work since it
// would duplicate a unique_ptr
}
}
return filtered;
}
我希望调用者保持对所有事物的所有权。我希望这个函数的返回值是纯只读的(const),我不想复制,因为复制一个 Thing 非常昂贵。
最好的方法是什么?
unique_ptrs 可以做到这一点吗?
在某种意义上,我们通过返回一个新的引用向量来创建多个引用,所以 unique_ptr 可能没有意义。但是,它纯粹是只读的!所以应该有一些方法来完成这项工作。 ``things'' 的生命周期保证比被过滤的东西要大。
请注意,调用者拥有提供的参数。
【问题讨论】:
-
您应该与 std::shared_ptr 共享所有权或分配副本。与
unique_ptr共享所有权是没有意义的。 -
我认为您需要重新考虑您的设计...您确定要在此处使用
std::unique_ptr吗?如果您想拥有多个所有者,std::shared_ptr会更有意义。 -
你可以用
ref创建reference_wrappers -
我要说明的是,无论是谁使用函数的返回值,都不能控制Things的寿命。
-
您可以简单地将原始指针存储在过滤后的向量中。
标签: c++11 unique-ptr lifetime ownership