weak_ptr的static_pointer_cast

tgo*_*art 14 weak-ptr c++11

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

How*_*ant 10

这应该为你做:

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));
}
Run Code Online (Sandbox Code Playgroud)

如果weak_ptr已过期,这将抛出异常.如果您希望获得null weak_ptr,那么请r.lock()改用.

  • 我刚刚扫描了标准文档,它看起来像没有人提过它.我也找不到它被提出或提议的记录(std :: weak_ptr的原始来源).也许原因在于,编写并且非平凡地选择适当的策略(throw或null)是微不足道的.并且提供两个函数(每个策略一个)是次优的,因为`static_pointer_cast`是一个通用名,可以在指针类型是通用的代码中使用. (2认同)

小智 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());
Run Code Online (Sandbox Code Playgroud)

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