#include <iostream>
#include <functional>
using namespace std;
struct bar {
void f() { cout << "hi"; }
};
void foo1(bar &c, void (bar::*function)()) { (c.*function)(); }
template <typename Handler> void foo2(bar &c, Handler h) { h(c); }
template <typename T> void foo3(T fun) { fun(); }
int main() {
bar b;
foo1(b, &bar::f);
foo2(b, std::mem_fn(&bar::f));
foo3([&b]() { b.f(); });
return 0;
}