18

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

4

3 回答 3

13

这应该为你做:

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()改用。

于 2011-05-19T23:59:49.637 回答
6

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

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

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

于 2014-10-23T17:44:25.210 回答
3

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

于 2014-11-26T23:35:50.457 回答