Mengapa tidak ada std::make_uniquetemplat 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 newbaik 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_uniquedengan deleter khusus, karena jelas itu mengalokasikan melalui biasa lama newdan karenanya harus menggunakan biasa lama delete:)
make_uniqueakan terbatas pada newalokasi ... well, tidak apa-apa jika Anda ingin menulisnya, tapi saya bisa melihat mengapa sesuatu seperti itu bukan bagian dari standar.
make_uniquetemplat karena konstruktor std::unique_ptreksplisit, dan oleh karena itu verbose untuk kembali unique_ptrdari 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_ptrmengambil parameter templat kedua yang entah bagaimana harus Anda izinkan - yang berbeda darishared_ptr.