static_pointer_cast 为weak_ptr

发布于 2024-11-08 02:31:58 字数 110 浏览 4 评论 0原文

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

In c++0x, there is a std::static_pointer_cast for std::shared_ptr, but there is no equivalent method for std::weak_ptr. Is this intentional, or an oversight? If an oversight, how would I define an appropriate function?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

爺獨霸怡葒院 2024-11-15 02:31:58

这应该可以为您完成:

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()

This ought to do it for you:

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));
}

This will throw an exception if the weak_ptr has expired. If you would rather get a null weak_ptr, then use r.lock() instead.

春庭雪 2024-11-15 02:31:58

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

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

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

Howard's version is correct, but in many cases it makes sense to simply pass weakptr.lock() as parameter to std::static_pointer_cast:

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

This syntax explicitly shows what is going on, and makes code easy to read.

怎樣才叫好 2024-11-15 02:31:58

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

The omission is intentional because despite it's name, std::weak_ptr is not a pointer type and does not provide pointer interface (operator ->, operator *, static_pointer_cast, etc.).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文