Чому std::make_unique
в стандартній бібліотеці C ++ 11 немає шаблону функцій? я знайшов
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
трохи багатослівний. Не було б наступне набагато приємніше?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Це new
добре приховує і лише один раз згадує тип.
У будь-якому випадку, ось моя спроба реалізації 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)...));
}
Мені знадобилося досить багато часу, щоб std::forward
скласти речі, але я не впевнений, чи правильно це. Є це? Що саме std::forward<Args>(args)...
означає? Що з цього робить компілятор?
make_unique
користувацький делетер, тому що, очевидно, він виділяє через звичайний старий new
і, отже, повинен використовувати звичайний старий delete
:)
make_unique
обмежуватиметься new
виділенням ... ну, це добре, якщо ви хочете його написати, але я можу зрозуміти, чому щось подібне не входить у стандарт.
make_unique
шаблон, оскільки конструктор std::unique_ptr
явний, і тому повертається unique_ptr
з функції багатослівно . Крім того , я б вважав за краще використовувати auto p = make_unique<foo>(bar, baz)
ніж std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
використовується другий параметр шаблону, який ви повинні якось дозволити - це відрізняється відshared_ptr
.