C++11 弱ptr的静态\u指针\u转换

C++11 弱ptr的静态\u指针\u转换,c++11,weak-ptr,C++11,Weak Ptr,在c++0x中,对于std::shared\u ptr有一个std::static\u pointer\u cast,但是对于std::weak\u ptr没有等效的方法。这是故意的还是疏忽?如果是疏忽,我将如何定义适当的功能?这应该为您做到: template<class T, class U> std::weak_ptr<T> static_pointer_cast(std::weak_ptr<U> const& r) { return s

在c++0x中,对于std::shared\u ptr有一个std::static\u pointer\u cast,但是对于std::weak\u ptr没有等效的方法。这是故意的还是疏忽?如果是疏忽,我将如何定义适当的功能?

这应该为您做到:

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));
}
模板
标准:弱ptr
静态指针转换(标准::弱指针常量&r)
{
返回std::static_pointer_cast(std::shared_ptr(r));
}

如果弱ptr已过期,这将引发异常。如果您希望得到一个空的弱\u ptr,那么使用
r.lock()

Howard的版本是正确的,但在许多情况下,只需将weakptr.lock()作为参数传递给std::static\u pointer\u cast即可:

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

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

省略是故意的,因为尽管名称不同,std::weak\u ptr不是指针类型,并且不提供指针接口(操作符->、操作符*、静态指针\u cast等)。

您知道这方面的历史吗?考虑到这篇文章写得多么微不足道,我想知道为什么标准委员会没有把它包括进去。我只是扫描了标准文档,在我看来似乎从来没有人提出过。我也找不到boost(std::weak_ptr的原始来源)上有人要求或提议它的记录。可能原因是编写策略很简单,选择合适的策略(抛出或空)也很重要。提供两个函数(每个策略一个)是次优的,因为
static\u pointer\u cast
是一个泛型名称,在指针类型为泛型的代码中可用。这里似乎有一个bug。由于a.lock()是一个临时指针,因此可以在随后的代码仍在使用b时删除底层指针实际上,在再次阅读静态\u指针\u cast文档之后,我错了。它返回一个共享指针,该指针将与a的基础共享指针共享。