Por que não há std::make_unique
modelo de função na biblioteca C ++ 11 padrão? eu acho
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
um pouco detalhado. O seguinte não seria muito melhor?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Isso oculta new
bem e apenas menciona o tipo uma vez.
De qualquer forma, aqui está minha tentativa de implementação de 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)...));
}
Levei um bom tempo para std::forward
compilar o material, mas não tenho certeza se está correto. É isso? O que exatamente std::forward<Args>(args)...
significa? O que o compilador faz disso?
make_unique
com um deleter costume, porque, obviamente, ele aloca via velha e simples new
e, portanto, deve usar planície antiga delete
:)
make_unique
seria limitada à new
alocação ... bem, tudo bem se você quiser escrever, mas posso ver por que algo assim não faz parte do padrão.
make_unique
modelo, pois o construtor de std::unique_ptr
é explícito e, portanto, é detalhado retornar unique_ptr
de uma função. Além disso, eu prefiro usar do auto p = make_unique<foo>(bar, baz)
que std::unique_ptr<foo> p(new foo(bar, baz))
.
make_unique
está chegando C++14
, consulte isocpp.org/blog/2013/04/trip-report-iso-c-spring-2013-meeting
unique_ptr
necessário um segundo parâmetro de modelo que você deve permitir de alguma forma - que é diferenteshared_ptr
.