std::make_unique
Standart C ++ 11 kitaplığında neden işlev şablonu yok ? buldum
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
biraz ayrıntılı. Aşağıdakiler çok daha hoş olmaz mıydı?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Bu new
güzel gizler ve sadece bir kez türü bahseder.
Her neyse, işte benim uygulama girişimim 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)...));
}
Bu std::forward
şeylerin derlenmesini sağlamak biraz zaman aldı , ama doğru olup olmadığından emin değilim. Bu mu? Tam olarak ne anlama std::forward<Args>(args)...
geliyor? Derleyici bundan ne çıkarıyor?
make_unique
açıkçası düz eski aracılığıyla ayırdığı için, özel bir deleter ile new
dolayısıyla ve gereken kullanmak düz eski delete
:)
make_unique
ile sınırlı olacak new
... Eh, yazmak istiyorsanız sorun değil, ama böyle bir şeyin neden standardın bir parçası olmadığını görebiliyorum.
make_unique
yapıcısı std::unique_ptr
açık olduğu için bir şablon kullanmayı seviyorum ve bu nedenle unique_ptr
bir işlevden dönmek ayrıntılıdır . Ayrıca, oldukça kullanmayı tercih ediyorum auto p = make_unique<foo>(bar, baz)
daha std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
bir şekilde izin vermeniz gereken ikinci bir şablon parametresi aldığını unutmayın - bu farklıdırshared_ptr
.