#include <functional>
#include <iostream>
class Timer
{
std::function<void()> _f;
public:
Timer(std::function<void()> && f) : _f(f) {}
void mach()
{
_f();
}
};
class X
{
public:
int i;
void function()
{
std::cout << "X: " << i << '\n';
}
};
void fun()
{
std::cout << "fun()\n";
}
int main()
{
X x;
x.i = 23;
X x2;
x2.i = 4711;
Timer t(std::bind(&X::function, &x));
Timer t2(std::bind(&X::function, &x2));
Timer t3(&fun);
t.mach();
t2.mach();
t3.mach();
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIFRpbWVyCnsKCXN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBfZjsKcHVibGljOgoJVGltZXIoc3RkOjpmdW5jdGlvbjx2b2lkKCk+ICYmIGYpIDogX2YoZikge30KCXZvaWQgbWFjaCgpCgl7CgkJX2YoKTsKCX0KfTsKCmNsYXNzIFgKewpwdWJsaWM6CglpbnQgaTsKCXZvaWQgZnVuY3Rpb24oKQoJewoJCXN0ZDo6Y291dCA8PCAiWDogIiA8PCBpIDw8ICdcbic7Cgl9Cn07Cgp2b2lkIGZ1bigpCnsKCXN0ZDo6Y291dCA8PCAiZnVuKClcbiI7Cn0KCmludCBtYWluKCkKewoJWCB4OwoJeC5pID0gMjM7CglYIHgyOwoJeDIuaSA9IDQ3MTE7CglUaW1lciB0KHN0ZDo6YmluZCgmWDo6ZnVuY3Rpb24sICZ4KSk7CglUaW1lciB0MihzdGQ6OmJpbmQoJlg6OmZ1bmN0aW9uLCAmeDIpKTsKCVRpbWVyIHQzKCZmdW4pOwoJdC5tYWNoKCk7Cgl0Mi5tYWNoKCk7Cgl0My5tYWNoKCk7Cn0K