有通用智能指针吗?

时间:2013-04-23 08:08:25

标签: c++ generics smart-pointers

我最近阅读了各种智能指针类型,我认为特别是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>
}

那么,是否存在这样的智能指针?如果是 - 使用哪些问题?如果不是 - 为什么不呢?

4 个答案:

答案 0 :(得分:4)

Differt指针类型允许不同的所有权处理,并且需要不同的运行时开销。在您的情况下,您可以使用模板:

template<typename TVector>
void doSomething(TVector& array) {
   // iterate over all array elements and do something
}

对所有智能(而非智能)指针operator*operator->

使用common

答案 1 :(得分:4)

一些误解会导致代码风格笨拙:

  1. 智能指针与原始指针一样通用:在调用指向对象的函数时,可以对它们进行大致相同的处理。如果你真的需要将它们传递给带有原始指针的函数(并且这些函数不会取得所有权),你可以使用它们的get()函数来给你指针。见3.

  2. 作用于集合的函数不应该将集合作为参数,而应该是一个带有一对迭代器的模板,然后可以通过解除引用迭代器指向的指针来使用它,从而提供对真实的对象。

  3. 不要使用原始指针编写函数。在呼叫站点使用引用代替和取消引用。我知道这并不总是可行的,但最常见的是。

  4. 在函数中循环的替代方法是使函数作用于单个对象(引用),并将循环放在调用站点。 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)

所有这些指针类型都会动态地包装一个裸指针。所以我们有两种情况:

  1. 您的方法以某种方式修改指针。在这种情况下,您将无法对其进行概括,因为根据类型的不同,它应该是不同的情况。

  2. 您永远不会修改指针。只需将const裸指针传递给函数即可。

答案 3 :(得分:0)

每种智能指针类型都有其onw使用模型。

  • unique_ptr不能放在容器中,既不可复制也不可复制

  • weak_ptr必须转换为shared_ptr才能访问引用的对象。例如,可用于缓存,在整个地方使用都很麻烦。

  • shared_ptr是您的最佳选择