#include <iostream>
#include <functional>
class C
{
public:
void func() { std::cout << "I'm C::func()" << std::endl; }
};
typedef void (C::*ptrFunc)();
void call1(C* pC, ptrFunc f)
{
(pC->*f)();
}
void call2(std::function<void()> f)
{
f();
}
int main()
{
C c;
call1(&c, &C::func);
call2(std::bind(&C::func, &c));
call2([&c]() { c.func(); });
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIEMKewpwdWJsaWM6CiAgICB2b2lkIGZ1bmMoKSB7IHN0ZDo6Y291dCA8PCAiSSdtIEM6OmZ1bmMoKSIgPDwgc3RkOjplbmRsOyB9Cn07Cgp0eXBlZGVmIHZvaWQgKEM6OipwdHJGdW5jKSgpOwoKdm9pZCBjYWxsMShDKiBwQywgcHRyRnVuYyBmKQp7CgkocEMtPipmKSgpOwp9Cgp2b2lkIGNhbGwyKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmKQp7CglmKCk7Cn0KCmludCBtYWluKCkKewoJQyBjOwoJY2FsbDEoJmMsICZDOjpmdW5jKTsKCWNhbGwyKHN0ZDo6YmluZCgmQzo6ZnVuYywgJmMpKTsKCWNhbGwyKFsmY10oKSB7IGMuZnVuYygpOyB9KTsKCXJldHVybiAwOwp9