런타임에 삭제 프로그램을 변경할 수 없다면 사용자 지정 삭제 유형을 사용하는 것이 좋습니다. 예를 들어, Deleter가에 대한 함수 포인터를 사용하는 경우 sizeof(unique_ptr<T, fptr>) == 2 * sizeof(T*)
. 즉, 바이트의 절반unique_ptr
객체 이 낭비됩니다.
그러나 모든 기능을 래핑하기 위해 사용자 정의 삭제기를 작성하는 것은 귀찮습니다. 고맙게도 함수에 템플릿 형식을 작성할 수 있습니다.
C ++ 17부터 :
template <auto fn>
using deleter_from_fn = std::integral_constant<decltype(fn), fn>;
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>
using deleter_from_fn = std::integral_constant<D, fn>;
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()};
std::unique_ptr<Bar, decltype(&destroy)> ptr_;