In Chapter 16, Policy-Based Design, we learned about policies, which are building blocks for classes—they let the programmer customize the implementation for a particular behavior. As an example, we can implement this policy-based smart pointer that automatically deletes the object it owns. The policy is the particular implementation of the deletion:
template <typename T, template <typename> class DeletionPolicy = DeleteByOperator>class SmartPtr { public: explicit SmartPtr( T* p = nullptr, const DeletionPolicy<T>& deletion_policy = DeletionPolicy<T>() ) : p_(p), deletion_policy_(deletion_policy) {} ~SmartPtr() { deletion_policy_(p_); } ... pointer interface ... private: T* p_; DeletionPolicy<T> deletion_policy_;}; ...