Я написал эту вещь, чтобы убедиться, что вещи, «распределенные» с размещением новых, всегда уничтожались правильным образом.Но это похоже на то, что кто-то написал бы по незнанию стандартной библиотеки.Есть ли лучший способ сделать это, который является частью стандартной библиотеки C ++?
template <typename T, typename... Args>
auto make_placement_unique(T *p, Args... args)
{
using ::std::unique_ptr;
using ::std::forward;
auto deleter = [](T *p) {
p->T::~T();
};
return unique_ptr<T, decltype(deleter)>{
new (p) T{forward<Args>(args)...},
deleter
};
}
template <typename T, typename... Args>
auto make_placement_unique(void *p, Args... args)
{
using ::std::forward;
return make_placement_unique(reinterpret_cast<T *>(p), forward<Args>(args)...);
}