weak_ptr的static_pointer_cast

时间:2011-05-19 23:26:31

标签: c++11 weak-ptr

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

3 个答案:

答案 0 :(得分:9)

这应该为你做到:

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已过期,则会抛出异常。如果您希望获得null weak_ptr,请改用r.lock()

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

遗漏是故意的,因为尽管它的名称,std :: weak_ptr不是指针类型,也不提供指针接口(operator - &gt;,operator *,static_pointer_cast等)。