如何简洁地创建shared_ptr?

Zac*_*ach 2 c++ shared-ptr c++11

如何缩短声明:

auto ptr = std::shared_ptr<CPoint>(new CPoint(x, y));
Run Code Online (Sandbox Code Playgroud)

请注意CPoint出现两次.可以缩短吗?

喜欢:

auto ptr = XXXX<CPoint>(x, y);
Run Code Online (Sandbox Code Playgroud)

XXXX是一个宏或任何东西.它应该适用于任何带有任何参数的构造函数.

auto ptrA = XXXX<ClassA>(); // a shared_ptr to new ClassA()
auto ptrB = XXXX<ClassB>(a, b, c); // a shared_ptr to new ClassB(a, b, c)
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 7

你可以而且应该使用函数模板std::make_shared:

auto p = std::make_shared<CPoint>(x, y);
auto pA = std::make_shared<ClassA>(); // a shared_ptr to new ClassA()
auto pB = std::make_shared<ClassB>(a, b, c); // a shared_ptr to new ClassB(a, b, c)
Run Code Online (Sandbox Code Playgroud)

要给它一个不同的名称,可以使用一个简单的包装函数:

template< class T, class... Args>
std::shared_ptr<T> foo( Args&&... args )
{
  return std::make_shared<T>( std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

然后

auto pB = foo<ClassB>(a, b, c);
Run Code Online (Sandbox Code Playgroud)

  • @Zach `template &lt;class T, class... Args&gt; auto snew(Args &amp;&amp;... args) { return std::make_shared&lt;T&gt;(std::forward&lt;Args&gt;(args)...); }` (2认同)