【问题标题】:static_pointer_cast for weak_ptrweak_ptr 的 static_pointer_cast
【发布时间】:2011-08-29 06:52:53
【问题描述】:

在 c++0x 中,std::shared_ptr 有一个 std::static_pointer_cast,但 std::weak_ptr 没有等效方法。这是故意的,还是疏忽?如果有疏忽,我将如何定义合适的功能?

【问题讨论】:

    标签: c++11 weak-ptr


    【解决方案1】:

    省略是故意的,因为尽管它的名字,std::weak_ptr 不是指针类型并且不提供指针接口(operator ->、operator *、static_pointer_cast 等)。

    【讨论】:

      【解决方案2】:

      霍华德的版本是正确的,但在许多情况下,将 weakptr.lock() 作为参数简单地传递给 std::static_pointer_cast 是有意义的:

      std::weak_ptr<A> a = ...;  
      std::weak_ptr<B> b = std::static_pointer_cast<B>(a.lock());
      

      此语法明确显示正在发生的事情,并使代码易于阅读。

      【讨论】:

      • 这里似乎有一个错误。由于 a.lock() 是临时的,因此可以删除底层指针,而其后的代码仍在使用 b。 - 实际上在再次阅读 static_pointer_cast 文档之后,我错了。它返回一个共享指针,该指针将与 a 的底层共享指针共享。
      【解决方案3】:

      这应该为你做:

      template<class T, class U>
      std::weak_ptr<T>
      static_pointer_cast(std::weak_ptr<U> const& r)
      {
          return std::static_pointer_cast<T>(std::shared_ptr<U>(r));
      }
      

      如果weak_ptr 已过期,这将引发异常。如果您希望得到一个空的weak_ptr,请改用r.lock()

      【讨论】:

      • 您了解这方面的历史吗?考虑到这写得多么琐碎,我想知道为什么标准委员会不包括它。
      • 我刚刚浏览了标准文档,在我看来,好像从来没有人提出过它。我也找不到在 boost 上被要求或提议的记录(std::weak_ptr 的原始来源)。原因可能是编写起来很简单,选择正确的策略(throw 或 null)也很重要。并且提供两个函数(每个策略一个)是次优的,因为static_pointer_cast 是一个通用名称,可用于指针类型为通用的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多