The first template parameter can be specialized explicitly to avoid copying
and/or to control the const qualification of a function object.

If the target function is a pointer to a class members, the corresponding
object can be specified as a reference, pointer, or smart pointer. In
case of the latter, a freestanding get_pointer function
must be defined (Boost provides this function for std::auto_ptr
and boost::shared_ptr).