Mengapa tidak ada std::make_unique
templat fungsi di pustaka C ++ 11 standar? saya menemukan
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
sedikit bertele-tele. Bukankah yang berikut ini akan jauh lebih baik?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Ini menyembunyikan yang new
baik dan hanya menyebutkan tipe sekali.
Bagaimanapun, ini adalah upaya saya untuk implementasi dari 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)...));
}
Butuh waktu cukup lama untuk menyelesaikannya std::forward
, tapi saya tidak yakin apakah itu benar. Apakah itu? Apa sebenarnya std::forward<Args>(args)...
artinya? Apa yang dilakukan oleh kompiler?
make_unique
dengan deleter khusus, karena jelas itu mengalokasikan melalui biasa lama new
dan karenanya harus menggunakan biasa lama delete
:)
make_unique
akan terbatas pada new
alokasi ... well, tidak apa-apa jika Anda ingin menulisnya, tapi saya bisa melihat mengapa sesuatu seperti itu bukan bagian dari standar.
make_unique
templat karena konstruktor std::unique_ptr
eksplisit, dan oleh karena itu verbose untuk kembali unique_ptr
dari suatu fungsi. Juga, saya lebih suka menggunakan auto p = make_unique<foo>(bar, baz)
daripada std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
mengambil parameter templat kedua yang entah bagaimana harus Anda izinkan - yang berbeda darishared_ptr
.