Warum gibt es std::make_uniquein der Standard-C ++ 11-Bibliothek keine Funktionsvorlage? ich finde
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
ein bisschen ausführlich. Wäre das Folgende nicht viel schöner?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Dies verbirgt das newschön und erwähnt den Typ nur einmal.
Wie auch immer, hier ist mein Versuch einer Implementierung von 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)...));
}
Ich habe eine ganze Weile std::forwardgebraucht, um das Zeug zu kompilieren, aber ich bin mir nicht sicher, ob es richtig ist. Ist es? Was genau bedeutet std::forward<Args>(args)...das? Was macht der Compiler daraus?
make_uniquemit einem benutzerdefinierten deleter, weil offensichtlich ordnet sie über einfache alten newund daher muss schlicht verwenden alt delete:)
make_uniquewürde sich also auf die newZuweisung beschränken ... Nun, es ist in Ordnung, wenn Sie ihn schreiben möchten, aber ich kann sehen, warum so etwas nicht zum Standard gehört.
make_uniqueVorlage, da der Konstruktor von std::unique_ptrexplizit ist und es daher ausführlich ist, unique_ptrvon einer Funktion zurückzukehren. Außerdem würde ich lieber verwenden auto p = make_unique<foo>(bar, baz)als std::unique_ptr<foo> p(new foo(bar, baz)).
unique_ptrein zweiter Vorlagenparameter erforderlich ist, den Sie irgendwie berücksichtigen sollten - das unterscheidet sich vonshared_ptr.