我最近阅读了各种智能指针类型,我认为特别是unique_ptr非常有用,而shared_ptr在某种程度上也与weak_ptr有关。但是我不知道如何创建可以处理指针类型的“通用”函数,如果这甚至是个好主意。
想象一下,如果有一个智能指针封装的对象向量,你想使用一个函数对所有元素应用一些动作,如下所示:
void doSomething(vector<shared_ptr<SomeType>>& array) {
// iterate over all array elements and do something
}
显然你需要为shared / unique / weak_ptr复制这个函数三次,这有点麻烦。拥有一个“泛型”/“多态”智能指针类型会更容易,它适合所有函数参数使用:
void doSomething(vector<generic_ptr<SomeType>>& array) {
// iterate over all array elements and do something
// no matter if array is a vector<shared_ptr> or vector<unique_ptr>
}
那么,是否存在这样的智能指针?如果是 - 使用哪些问题?如果不是 - 为什么不呢?
答案 0 :(得分:4)
Differt指针类型允许不同的所有权处理,并且需要不同的运行时开销。在您的情况下,您可以使用模板:
template<typename TVector>
void doSomething(TVector& array) {
// iterate over all array elements and do something
}
对所有智能(而非智能)指针operator*
和operator->
答案 1 :(得分:4)
一些误解会导致代码风格笨拙:
智能指针与原始指针一样通用:在调用指向对象的函数时,可以对它们进行大致相同的处理。如果你真的需要将它们传递给带有原始指针的函数(并且这些函数不会取得所有权),你可以使用它们的get()
函数来给你指针。见3.
作用于集合的函数不应该将集合作为参数,而应该是一个带有一对迭代器的模板,然后可以通过解除引用迭代器指向的指针来使用它,从而提供对真实的对象。
不要使用原始指针编写函数。在呼叫站点使用引用代替和取消引用。我知道这并不总是可行的,但最常见的是。
在函数中循环的替代方法是使函数作用于单个对象(引用),并将循环放在调用站点。 C ++ 11使这个非常干净:
void some_function(item_type& item); // const if necessary
for(auto&& item_ptr : collection_of_item_smart_ptrs)
some_function(*item_ptr);
明确制定意图,目的和类型,没有任何语法或风格上的麻烦。
答案 2 :(得分:0)
所有这些指针类型都会动态地包装一个裸指针。所以我们有两种情况:
您的方法以某种方式修改指针。在这种情况下,您将无法对其进行概括,因为根据类型的不同,它应该是不同的情况。
您永远不会修改指针。只需将const裸指针传递给函数即可。
答案 3 :(得分:0)
每种智能指针类型都有其onw使用模型。
unique_ptr不能放在容器中,既不可复制也不可复制
weak_ptr必须转换为shared_ptr才能访问引用的对象。例如,可用于缓存,在整个地方使用都很麻烦。
shared_ptr是您的最佳选择