#include <iostream>
#include <functional>
using namespace std;
struct A
{
void f() const { cout << this << ", A::f()" << endl; }
void g() const { cout << this << ", A::g()" << endl; }
void h() const { cout << this << ", A::h()" << endl; }
};
int main()
{
A a;
auto f = function<void(A&)>{&A::f};
auto g = bind(&A::g, &a);
auto h = [&a](){ a.h(); };
function<void()> func;
cout << "Uzycie: " << endl;
f(a);
g();
h();
cout << "std::function: " << endl;
func = g;
func();
func = h;
func();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgQQp7Cgl2b2lkIGYoKSBjb25zdCB7IGNvdXQgPDwgdGhpcyA8PCAiLCBBOjpmKCkiIDw8IGVuZGw7IH0KCXZvaWQgZygpIGNvbnN0IHsgY291dCA8PCB0aGlzIDw8ICIsIEE6OmcoKSIgPDwgZW5kbDsgfQoJdm9pZCBoKCkgY29uc3QgeyBjb3V0IDw8IHRoaXMgPDwgIiwgQTo6aCgpIiA8PCBlbmRsOyB9Cn07CgppbnQgbWFpbigpCnsKCUEgYTsKCWF1dG8gZiA9IGZ1bmN0aW9uPHZvaWQoQSYpPnsmQTo6Zn07CglhdXRvIGcgPSBiaW5kKCZBOjpnLCAmYSk7CglhdXRvIGggPSBbJmFdKCl7IGEuaCgpOyB9OwoKCWZ1bmN0aW9uPHZvaWQoKT4gZnVuYzsKCgljb3V0IDw8ICJVenljaWU6ICIgPDwgZW5kbDsKCWYoYSk7CglnKCk7CgloKCk7CgkKCWNvdXQgPDwgInN0ZDo6ZnVuY3Rpb246ICIgPDwgZW5kbDsKCWZ1bmMgPSBnOwoJZnVuYygpOwoJZnVuYyA9IGg7CglmdW5jKCk7Cgp9Cg==