Dlaczego std::make_unique
w standardowej bibliotece C ++ 11 nie ma szablonu funkcji? znajduję
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
trochę gadatliwy. Czy poniższe rzeczy nie byłyby o wiele ładniejsze?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
To new
ładnie ukrywa i wspomina o typie tylko raz.
Tak czy inaczej, oto moja próba wdrożenia 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)...));
}
Sporo czasu zajęło mi std::forward
skompilowanie tego pliku , ale nie jestem pewien, czy jest poprawny. Czy to jest Co dokładnie std::forward<Args>(args)...
znaczy? Co robi z tego kompilator?
make_unique
za pomocą niestandardowego programu usuwającego, ponieważ oczywiście alokuje on za pomocą zwykłego starego new
i dlatego należy używać zwykłego starego delete
:)
make_unique
byłby ograniczony do new
alokacji ... no cóż, dobrze jest, jeśli chcesz to napisać, ale rozumiem, dlaczego coś takiego nie jest częścią standardu.
make_unique
szablonu, ponieważ konstruktor std::unique_ptr
jest jawny, a zatem zwracanie się unique_ptr
z funkcji jest pełne . Wolałbym też użyć auto p = make_unique<foo>(bar, baz)
niż std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
bierze drugi parametr szablonu, na który powinieneś jakoś zezwolić - który jest inny niżshared_ptr
.