繁体   English   中英

是否有一个与shared_from_this等效的weak_ptr?

[英]Is there a weak_ptr equivalent to shared_from_this?

我有一个我知道将永远属于std::shared_ptr 但是,将shared_ptr甚至weak_ptr传递给不需要所有权或生命周期保证的函数和方法会产生不必要的开销。 为了解决这个问题,我经常将原始指针传递给函数。 类本身继承自std::enable_shared_from_this因此如果函数需要获取指针的所有权,它可以使用类的方法来获取shared_ptr

这一切都很美妙。 但是有时候我真的不想从原始指针创建shared_ptr ,而我想要的是weak_ptr

根据我对std::shared_ptr的通常实现的理解,它有两个原子变量用作引用计数器; 一个用于shared_ptr ,一个用于weak_ptr

如果我只有一个指向我的类的原始指针,并且我想要一个weak_ptr ,我必须首先创建一个shared_ptr并将其转换。 这样做意味着引用计数器会像这样改变:

  • 构造shared_ptr ,增加shared_ptr计数器
  • 复制构造weak_ptr ,增加weak_ptr计数器
  • 允许shared_ptr超出范围,减少shared_ptr计数器

这似乎违背了“你不为你不使用的东西买单”的想法。 有没有办法让我的班级在没有首先创建shared_ptr情况下提供weak_ptr

在2015年10月的会议中,提案P0033被C ++ 17接受,它将weak_from_this添加到源自std::enable_shared_from_this

有没有办法让我的班级在没有首先创建shared_ptr的情况下提供weak_ptr?

不是在C ++ 14中; enable_shared_from_this支持的唯一操作是创建shared_ptr 现在, enable_shared_from_this应该有足够的信息来直接构造weak_ptr 但是你不能从外面做,因为类没有向你公开它的实现细节。

C ++ 17支持通过weak_from_thisenable_shared_from_this类中获取weak_ptr

实施它几乎是微不足道的,不值得放入图书馆......

#include <memory>

template<class T> std::weak_ptr<T> weak_from_this(T*p) {
  return { p->shared_from_this() };
}

struct S : std::enable_shared_from_this<S>
{
  auto foo() {
    return weak_from_this(this);
  }
};


int main()
{
  auto ps = std::make_shared<S>();
  auto wps = ps->foo();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM