我写这件事是为了确保始终以正确的方式销毁带有新放置的“分配”的事物。但这似乎是某人会出于对标准库的无知而写的东西。是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)...);
}