#include <string>
#include <functional>
#include <iostream>

    template<class T>
    struct reference_only {
      T& t;
      operator T&(){ return t; }
      operator T()=delete;
      reference_only(T& tin):t(tin){}
    };

 struct Foo {};
 typedef void func_type(Foo *&);
 typedef std::function<void(reference_only<Foo*>)> FunctionalType;

 void foo1(Foo *)
 {
     std::cout << "foo1\n";
 }
 void foo2(Foo *&)
 {
     std::cout << "foo2\n";
 }

 int main()
 {
   Foo f;     
   Foo* pf = &f;
 #if 0
   FunctionalType f1 = foo1;
   f1(pf);
 #else
   FunctionalType f2 = foo2;
   f2(pf);
#endif
}