#include <iostream>
class Foo{
public:
Foo(void* object): obj(object) {}
void callFunc(void (*func)(void *)){
func(obj);
}
private:
void* obj;
};
class Bar{
public:
Bar(): foo(this) {}
void callSomeFunc(){
foo.callFunc(someFuncAdapter);
}
void someFunc(){
std::cout << "hi\n";
}
static void someFuncAdapter(void *obj) {
static_cast<Bar *>(obj)->someFunc();
}
private:
Foo foo;
};
int main(){
Bar bar;
bar.callSomeFunc();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgRm9vewpwdWJsaWM6CiAgICBGb28odm9pZCogb2JqZWN0KTogb2JqKG9iamVjdCkge30KCiAgICB2b2lkIGNhbGxGdW5jKHZvaWQgKCpmdW5jKSh2b2lkICopKXsKICAgICAgICBmdW5jKG9iaik7CiAgICB9Cgpwcml2YXRlOgogICAgdm9pZCogb2JqOwp9OwoKY2xhc3MgQmFyewpwdWJsaWM6CiAgICBCYXIoKTogZm9vKHRoaXMpIHt9CgogICAgdm9pZCBjYWxsU29tZUZ1bmMoKXsKICAgICAgICBmb28uY2FsbEZ1bmMoc29tZUZ1bmNBZGFwdGVyKTsKICAgIH0KCiAgICB2b2lkIHNvbWVGdW5jKCl7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJoaVxuIjsKICAgIH0KICAgIAogICAgc3RhdGljIHZvaWQgc29tZUZ1bmNBZGFwdGVyKHZvaWQgKm9iaikgewogICAgCXN0YXRpY19jYXN0PEJhciAqPihvYmopLT5zb21lRnVuYygpOwogICAgfQoKcHJpdmF0ZToKICAgIEZvbyBmb287Cn07CgppbnQgbWFpbigpewogICAgQmFyIGJhcjsKICAgIGJhci5jYWxsU29tZUZ1bmMoKTsKICAgIHJldHVybiAwOwp9