Было бы более эффективно иметь помощника 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
.
person
Kerrek SB
schedule
17.08.2012
Foo
не принимает право собственности. Смыслshared_ptr
в том, чтобы разделять право собственности. - person juanchopanza   schedule 17.08.2012std::shared_ptr<Stuff> foosStuff(new Stuff());
- person stefaanv   schedule 17.08.2012