#include <iostream>
using namespace std;
struct IFoo{
virtual void doWork() = 0;
};
template<class T>
struct MemberFuncFoo : public IFoo{
typedef void (T::*FuncType)();
MemberFuncFoo(T *instance, FuncType memberFunc):
m_instance(instance),
m_memberFunc(memberFunc)
{}
virtual void doWork() override{
(m_instance->*m_memberFunc)();
}
private:
T* m_instance;
FuncType m_memberFunc;
};
struct Bar{
void baz(){
cout << "baz" << endl;
}
};
int main() {
Bar bar;
IFoo *ptr = new MemberFuncFoo<Bar>(&bar,&Bar::baz);
ptr->doWork();
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IElGb297Cgl2aXJ0dWFsIHZvaWQgZG9Xb3JrKCkgPSAwOwkKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBNZW1iZXJGdW5jRm9vIDogcHVibGljIElGb297Cgl0eXBlZGVmIHZvaWQgKFQ6OipGdW5jVHlwZSkoKTsKCQoJTWVtYmVyRnVuY0ZvbyhUICppbnN0YW5jZSwgRnVuY1R5cGUgbWVtYmVyRnVuYyk6CgkJbV9pbnN0YW5jZShpbnN0YW5jZSksCgkJbV9tZW1iZXJGdW5jKG1lbWJlckZ1bmMpCgl7fQoJCgl2aXJ0dWFsIHZvaWQgZG9Xb3JrKCkgb3ZlcnJpZGV7CgkJKG1faW5zdGFuY2UtPiptX21lbWJlckZ1bmMpKCk7Cgl9CgkKcHJpdmF0ZToKCVQqIG1faW5zdGFuY2U7CglGdW5jVHlwZSBtX21lbWJlckZ1bmM7Cn07CgpzdHJ1Y3QgQmFyewoJdm9pZCBiYXooKXsKCQljb3V0IDw8ICJiYXoiIDw8IGVuZGw7CQkKCX0KfTsKCmludCBtYWluKCkgewoJQmFyIGJhcjsKCUlGb28gKnB0ciA9IG5ldyBNZW1iZXJGdW5jRm9vPEJhcj4oJmJhciwmQmFyOjpiYXopOwoJcHRyLT5kb1dvcmsoKTsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXJldHVybiAwOwp9