Чому 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.