除非您需要能够在运行时更改删除器,否则我强烈建议您使用自定义删除器类型。例如,如果为您的删除器使用函数指针,sizeof(unique_ptr<T, fptr>) == 2 * sizeof(T*)
. 换句话说,unique_ptr
对象的一半字节被浪费了。
但是,编写一个自定义删除器来包装每个函数是一件麻烦事。幸运的是,我们可以在函数上编写一个模板类型:
从 C++17 开始:
template <auto fn>
struct deleter_from_fn {
template <typename T>
constexpr void operator()(T* arg) const {
fn(arg);
}
};
template <typename T, auto fn>
using my_unique_ptr = std::unique_ptr<T, deleter_from_fn<fn>>;
// usage:
my_unique_ptr<Bar, destroy> p{create()};
在 C++17 之前:
template <typename D, D fn>
struct deleter_from_fn {
template <typename T>
constexpr void operator()(T* arg) const {
fn(arg);
}
};
template <typename T, typename D, D fn>
using my_unique_ptr = std::unique_ptr<T, deleter_from_fn<D, fn>>;
// usage:
my_unique_ptr<Bar, decltype(&destroy), destroy> p{create()};