#include<iostream>
#include<functional>
class Foo{
public:
Foo(void* object): obj(object) {}
template<typename T>
void callFunc(void (T::*func)()){
m_func = std::bind(func, static_cast<T*>(obj));
m_func();
}
private:
void* obj;
std::function<void()> m_func;
};
class Bar{
public:
Bar(): foo(this) {}
void callSomeFunc(){
foo.callFunc(&Bar::someFunc);
}
void someFunc(){
std::cout << "hi\n";
}
private:
Foo foo;
};
int main(){
Bar bar;
bar.callSomeFunc();
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGZ1bmN0aW9uYWw+CgpjbGFzcyBGb297CnB1YmxpYzoKICAgIEZvbyh2b2lkKiBvYmplY3QpOiBvYmoob2JqZWN0KSB7fQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICB2b2lkIGNhbGxGdW5jKHZvaWQgKFQ6OipmdW5jKSgpKXsKICAgICAgICBtX2Z1bmMgPSBzdGQ6OmJpbmQoZnVuYywgc3RhdGljX2Nhc3Q8VCo+KG9iaikpOwogICAgICAgIG1fZnVuYygpOwogICAgfQoKcHJpdmF0ZToKICAgIHZvaWQqIG9iajsKICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBtX2Z1bmM7Cn07CgpjbGFzcyBCYXJ7CnB1YmxpYzoKICAgIEJhcigpOiBmb28odGhpcykge30KCiAgICB2b2lkIGNhbGxTb21lRnVuYygpewogICAgICAgIGZvby5jYWxsRnVuYygmQmFyOjpzb21lRnVuYyk7CiAgICB9CgogICAgdm9pZCBzb21lRnVuYygpewogICAgICAgIHN0ZDo6Y291dCA8PCAiaGlcbiI7CiAgICB9Cgpwcml2YXRlOgogICAgRm9vIGZvbzsKfTsKCmludCBtYWluKCl7CiAgICBCYXIgYmFyOwogICAgYmFyLmNhbGxTb21lRnVuYygpOwogICAgcmV0dXJuIDA7Cn0=