Warum gibt es std::make_unique
in 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 new
schö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::forward
gebraucht, 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_unique
mit einem benutzerdefinierten deleter, weil offensichtlich ordnet sie über einfache alten new
und daher muss schlicht verwenden alt delete
:)
make_unique
würde sich also auf die new
Zuweisung 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_unique
Vorlage, da der Konstruktor von std::unique_ptr
explizit ist und es daher ausführlich ist, unique_ptr
von 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_ptr
ein zweiter Vorlagenparameter erforderlich ist, den Sie irgendwie berücksichtigen sollten - das unterscheidet sich vonshared_ptr
.