2011-05-19 75 views
13

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

回答

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已过期。如果您更希望得到一个空的weak_ptr,然后使用r.lock()代替。

+0

你是否知道这个历史?鉴于这是写得多么微不足道,我想知道为什么标准委员会没有包括它。 – tgoodhart 2011-05-20 15:02:39

+2

我只是扫描的文档标准,像没有人提出这在我看来。我也无法找到被要求或升压提出(的std :: weak_ptr的原始源)它的记录。也许原因在于编写代码很简单,并且选择合适的策略(throw或null)是非常重要的。并且提供两个函数(每个策略一个函数)是次优的,因为'static_pointer_cast'是一个通用名称,可用于指针类型为通用的代码。 – 2011-05-20 17:30:16

2

霍华德的版本是正确的,但在许多情况下是有意义的只是通过weakptr.lock()作为参数为std :: static_pointer_cast:

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

这句法明确显示是怎么回事,和品牌代码易于阅读。

+0

好像有一个错误在这里。由于a.lock()是一个临时指针,所以在此之后的代码仍然使用b时,可以删除底层指针。 - 实际上在再次阅读static_pointer_cast文档后,我错了。它返回一个共享指针,它将与一个底层共享指针共享。 – 2017-04-05 17:58:42

0

遗漏是故意的,因为尽管它的名字,性病:: weak_ptr的不是指针类型,不提供指针接口(运营商 - >运算符*,static_pointer_cast等)。

相关问题