這可能是更有效的有make_foo
幫手:
Foo make_foo() { return Foo(std::make_shared<Stuff>()); }
現在你可以說auto f = make_foo();
。或者至少自己使用make_shared
調用,因爲生成的shared_ptr
可能比由new
表達式構造的效率更高。
auto f = Foo::make(true, 'x', Blue);
這就是說,除非你:如果Stuff
其實需要構造函數參數,私人輔助構造可能是合適的:
struct Foo
{
template <typename ...Args>
static Foo make(Args &&... args)
{
return Foo(direct_construct(), std::forward<Args>(args)...);
};
private:
struct direct_construct{};
template <typeaname ...Args>
Foo(direct_construct, Args &&... args)
: m_myStuff(std::make_shared<Stuff>(std::forward<Args>(args)...)) // #1
{ }
};
您可以包裹Foo::make
到上述make_foo
,或直接使用它真的是分享所有權,std::unique_ptr<Stuff>
聽起來像更可取的方法:它在概念上更簡單,也更有效。在這種情況下,您會在標記爲#1
的行中說m_myStuff(new Stuff(std::forward<Args>(args)...))
。
@sellibitze typo – Baz 2012-08-17 08:41:49
不是真的,'Foo'不*取*擁有權。 'shared_ptr'的要點是*共享*所有權。 – juanchopanza 2012-08-17 08:43:44
或者更喜歡'std :: shared_ptr foosStuff(new Stuff());' –
stefaanv
2012-08-17 08:47:37