Perché non esiste un std::make_uniquemodello 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 newbene 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::forwardcompilare le cose, ma non sono sicuro che sia corretto. È? Cosa std::forward<Args>(args)...significa esattamente ? Cosa ne pensa il compilatore?
make_uniquecon un deleter personalizzato, perché ovviamente si alloca via semplicemente vecchio newe quindi deve usare semplicemente vecchio delete:)
make_uniquesarebbe limitata newall'allocazione ... beh, va bene se vuoi scriverlo, ma posso capire perché qualcosa del genere non fa parte dello standard.
make_uniquemodello poiché il costruttore di std::unique_ptrè esplicito, e quindi è prolisso tornare unique_ptrda una funzione. Inoltre, io preferisco usare auto p = make_unique<foo>(bar, baz)quello std::unique_ptr<foo> p(new foo(bar, baz)).
unique_ptraccetta un secondo parametro modello che dovresti in qualche modo consentire - che è diverso dashared_ptr.