【发布时间】:2013-04-08 19:46:07
【问题描述】:
我对 C++11 的智能指针非常陌生,我正在尝试在项目中有效地使用它们。在我的项目中,我有很多函数使用 const 引用 vector 或 unique_ptr,对其进行一些计算,并将一些结果放入返回参数中,如下所示:
void computeCoefficients(const vector<unique_ptr<Scalar>>& roots,
vector<unique_ptr<Scalar>>& coeffs) {
...
}
我正在使用unique_ptr,因为调用所有这些函数的过程是vector 中对象的唯一所有者,并且这些函数只是“借用”对象以便将它们作为输入读取。
现在我正在尝试编写一个函数,对它接收到的 vector 的不同子集进行计算,并且为了做到这一点,它需要具有包含这些子集的 vector 的不同“版本”传递给另一个以vector<unique_ptr<Scalar>> 作为输入的函数。但是获得向量子集的唯一方法是复制它——这是一个问题,因为unique_ptrs 不能被复制。我希望代码看起来像这样:
void computeOnSet(const vector<unique_ptr<Scalar>>& set, unique_ptr<Scalar>& output) {
...
}
void computeOnAllSubsets(const vector<unique_ptr<Scalar>>& set, vector<unique_ptr<Scalar>>& outputs) {
for(int i = 0; i < input.size(); i++) {
auto subset = vector<unique_ptr<Scalar>>(set.begin(), set.begin()+i);
subset.insert(subset.end(), set.begin()+i+1, set.end();
computeOnSubset(subset, outputs.at(i));
}
}
这当然行不通。如果我用shared_ptrs 替换unique_ptrs,我可以让它工作,但这有两个问题:
- 从哲学上讲,这意味着我与
computeOnSubsets函数共享该集合的所有权,而我不是;调用者仍然是唯一的所有者。 (我读到shared_ptr表示您正在与拥有它的副本的所有东西共享所有权)。 - 它会引入引用计数的开销,即使在我不需要它的地方也是如此,因为它会迫使我将所有方法的输入参数更改为
vector<shared_ptr<Scalar>>。
我要做的就是制作一个 临时的、只读的指针副本,其唯一目的是制作 临时的、只读的子向量。有没有办法做到这一点? weak_ptr 听起来像我需要的(非拥有临时指针),但它只能与 shared_ptr 一起使用。
【问题讨论】:
-
你确定不能只拥有
vector<Scalar>吗? -
是的,因为
Scalar实际上是一个接口,而不是一个具体的类。据我所知,对 STL 容器使用继承和多态性的唯一方法是使用指针,而不是值类型。 -
是的,没错。我虽然
Scalar是一个具体的、轻量级的类。 -
你可以让你的函数接受迭代器(同时泛化),然后简单地传递转换迭代器来取消引用源迭代器(Boost 可能已经有了这个)。
-
如果
computeCoefficients产生vector<unique_ptr<Scalar>>& coeffs,为什么不返回它?使用返回值的参数列表是不好的风格。
标签: c++ c++11 shared-ptr stdvector unique-ptr