2015-04-29 59 views
2

如何使語句更短:如何簡潔地創建shared_ptr?

auto ptr = std::shared_ptr<CPoint>(new CPoint(x, y)); 

請注意CPoint出現了兩次。它可以縮短嗎?

,如:

auto ptr = XXXX<CPoint>(x, y); 

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) 

回答

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) 

給它一個不同的名稱,你可以用一個簡單的包裝功能:

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

然後

auto pB = foo<ClassB>(a, b, c); 
+0

非常好,謝謝! – Zach

+0

如何使用typedef std:make_shared ,我想將它縮短爲:'auto p = $ new (a,b,c)'? – Zach

+2

@Zach'模板 auto snew(Args && ... args){ return std :: make_shared (std :: forward (args)...); } @ – Quentin