Listing 2: Smart function pointer interface

class function_ptr
{
public:
    function_ptr();
    function_ptr(const function_ptr &other);
    template<typename nullary_function>
      function_ptr(nullary_function function);
    ~function_ptr();
    function_ptr &operator=(const function_ptr &rhs)
    void operator()() const;
    ...
};