Perché non esiste un std::make_unique
modello di funzione nella libreria C ++ 11 standard? io trovo
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
un po 'prolisso. Quanto segue non sarebbe molto più bello?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Questo nasconde new
bene e menziona il tipo solo una volta.
Ad ogni modo, ecco il mio tentativo di implementazione di make_unique
:
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
Mi ci è voluto un po 'di tempo per std::forward
compilare le cose, ma non sono sicuro che sia corretto. È? Cosa std::forward<Args>(args)...
significa esattamente ? Cosa ne pensa il compilatore?
make_unique
con un deleter personalizzato, perché ovviamente si alloca via semplicemente vecchio new
e quindi deve usare semplicemente vecchio delete
:)
make_unique
sarebbe limitata new
all'allocazione ... beh, va bene se vuoi scriverlo, ma posso capire perché qualcosa del genere non fa parte dello standard.
make_unique
modello poiché il costruttore di std::unique_ptr
è esplicito, e quindi è prolisso tornare unique_ptr
da una funzione. Inoltre, io preferisco usare auto p = make_unique<foo>(bar, baz)
quello std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
accetta un secondo parametro modello che dovresti in qualche modo consentire - che è diverso dashared_ptr
.