To może być bardziej wydajny, aby mieć make_foo
pomocnika:
Foo make_foo() { return Foo(std::make_shared<Stuff>()); }
Teraz można powiedzieć auto f = make_foo();
. Lub przynajmniej skorzystaj z wywołania make_shared
samodzielnie, ponieważ wynikowy shared_ptr
może być bardziej wydajny niż ten skonstruowany z wyrażenia new
. A jeśli Stuff
faktycznie ma argumenty konstruktora, prywatny konstruktor pomocniczy może być przydatny:
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
{ }
};
Można też owinąć Foo::make
do powyższego make_foo
lub użyć go bezpośrednio:
auto f = Foo::make(true, 'x', Blue);
To powiedziawszy, chyba że "Naprawdę udostępnianie własności, std::unique_ptr<Stuff>
brzmi jak bardziej preferowane podejście: Jest zarówno koncepcyjnie znacznie prostsze, a także nieco bardziej wydajne. W takim przypadku można powiedzieć m_myStuff(new Stuff(std::forward<Args>(args)...))
w wierszu oznaczonym #1
.
@sellibitze litero – Baz
Niezupełnie, 'Foo' nie * bierze * własność. Celem 'shared_ptr' jest * share * ownership. – juanchopanza
Lub wolisz 'std :: shared_ptr foosStuff (new Stuff());' –
stefaanv