¿Por qué no hay std::make_unique
una plantilla de función en la biblioteca estándar de C ++ 11? Encuentro
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
Un poco detallado. ¿No sería mucho mejor lo siguiente?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Esto oculta new
muy bien y solo menciona el tipo una vez.
De todos modos, aquí está mi intento de implementar 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)...));
}
Me llevó bastante tiempo std::forward
compilar las cosas, pero no estoy seguro de si es correcto. ¿Lo es? ¿Qué std::forward<Args>(args)...
significa exactamente ? ¿Qué hace el compilador de eso?
make_unique
con un Deleter costumbre, porque obviamente se asigna a través de llanura de edad new
y por lo tanto debe utilizar el viejo y simple delete
:)
make_unique
se limitaría a la new
asignación ... bueno, está bien si quieres escribirla, pero puedo ver por qué algo así no es parte del estándar.
make_unique
plantilla ya que el constructor de std::unique_ptr
es explícito y, por lo tanto, es detallado regresar unique_ptr
de una función. Además, prefiero usar auto p = make_unique<foo>(bar, baz)
que std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
toma un segundo parámetro de plantilla que de alguna manera debería permitir, que es diferenteshared_ptr
.