如何将对象实例转换为shared_ptr实例

Cas*_*211 10 c++ boost shared-ptr

假设我有两个shared_ptr类型,例如

boost::shared_ptr<ObjA> sptrA;
boost::shared_ptr<ObjB> sptrB;
Run Code Online (Sandbox Code Playgroud)

现在假设sptrA->SomeMethod()返回了一个简单的ObjB类型(不是共享ptr).我可以在sptrB中以某种方式存储该类型吗?这样我就可以做这样的事情,以便返回的类型实例自动转换为boost_shared ptr

sptrB = sptrA->SomeMethod(); 
Run Code Online (Sandbox Code Playgroud)

我只是好奇地询问这个问题,是否可能?

jog*_*pan 6

创建boost:shared_ptr对象的最标准方法是使用make_sharedBoost提供的功能:

#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

struct A {};

A generator() {
  return A();
}

int main()
{
  using namespace boost;
  shared_ptr<A> p = make_shared<A>(generator());
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于generator()函数A按值返回一个对象,因此上面的语法暗示new使用复制构造函数调用A,并且生成的指针包装在共享指针对象中.换句话说,make_shared并不完全执行到共享指针的转换 ; 相反,它在堆上创建对象的副本并为其提供内存管理.这可能是您需要的,也可能不是.


请注意,这相当于什么std::make_shared的确实std::shared_ptr在C++ 11.


为您提供在你的问题中提到的方便的语法的一种方法是定义一个转换操作符来shared_ptr<A>进行A:

struct A {
  operator boost::shared_ptr<A>() {
    return boost::make_shared<A>(*this);
  }
};
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它如下:

shared_ptr<A> p = generate();
Run Code Online (Sandbox Code Playgroud)

这将自动"转换"函数返回的对象.同样,这里的转换实际上意味着堆分配,复制和包装在共享指针中.因此,我不确定我是否建议定义这样的便利转换运算符.它使语法非常方便,但它作为所有隐式转换运算符,也可能意味着您隐式地导致这些"转换"发生在您不期望的地方.