make_foo
ヘルパーがある方が効率的かもしれません:
Foo make_foo() { return Foo(std::make_shared<Stuff>()); }
今、あなたは言うことができますauto f = make_foo();
。または、少なくともmake_shared
自分で呼び出しを使用してください。結果は、式shared_ptr
から構築されたものよりも効率的である可能性があるためです。実際にコンストラクターの引数を取る場合は、プライベートな補助コンストラクターが適している可能性がありますnew
。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
、直接使用できます。
auto f = Foo::make(true, 'x', Blue);
そうは言っても、実際に所有権を共有しstd::unique_ptr<Stuff>
ている場合を除き、より好ましいアプローチのように思えます。概念的にははるかに単純であり、いくらか効率的でもあります。その場合m_myStuff(new Stuff(std::forward<Args>(args)...))
、 とマークされた行で言うでしょう#1
。