#include <iostream>

void callback( int i )
{
   std::cout << __PRETTY_FUNCTION__ << " -> " << i << '\n';
}

struct Callback
{
   void operator() (int i )
   {
      std::cout << __PRETTY_FUNCTION__ << " -> " << i << '\n';
   }
};

template< typename Func >
void do_callback( Func f, int i)
{
   std::cout << __PRETTY_FUNCTION__ << " -> ";
   f(i);
}

int main()
{
   do_callback( callback, 1 );
   do_callback( &callback, 2 );
   do_callback( Callback(), 3 );
   do_callback( []( int i ){ std::cout << __PRETTY_FUNCTION__ << " -> " << i << '\n'; }, 4 );
}