#include #include using std::cout; using std::endl; using std::shared_ptr; struct MyInt{ MyInt(int v):val(v){ cout << " Hello: " << val << endl; } ~MyInt(){ cout << " Good Bye: " << val << endl; } int val; }; template struct Deleter{ void operator()(T *ptr){ ++Deleter::count; delete ptr; } static int count; }; template int Deleter::count=0; typedef Deleter IntDeleter; typedef Deleter DoubleDeleter; typedef Deleter MyIntDeleter; int main(){ cout << endl; { shared_ptr sharedPtr1(new int(1998),IntDeleter()); shared_ptr sharedPtr2(new int(2011),IntDeleter()); shared_ptr sharedPtr3(new double(3.17),DoubleDeleter()); shared_ptr sharedPtr4(new MyInt(2017),MyIntDeleter()); } cout << "Deleted " << IntDeleter().count << " int values." << endl; cout << "Deleted " << DoubleDeleter().count << " double value." << endl; cout << "Deleted " << MyIntDeleter().count << " MyInt value." << endl; cout << endl; }