In the previous section, we learned how to implement the simplest policy object. The policy can be of any type as long as it conforms to the interface convention, and is stored in the class as a data member. The policy object is most commonly generated by a template; however, it could be a regular, non-template, object that's specific to a particular pointer type, or even a function. The use of the policy was limited to a specific behavioral aspect, such as deletion of the object owned by the smart pointer.
There are several ways in which such policies can be implemented and used. First of all, let's review the declaration of a smart pointer with a deletion policy:
template <typename T, typename DeletionPolicy = ...