#include <iostream>
#include <map>
using namespace std;
class base {
protected:
typedef void (base::*fn)() ;
base(){
fn_arr["foo"]=&base::foo;
}
void foo() {
cout << "i'm foo" << endl;
}
public:
map<std::string, fn> fn_arr;
};
class derived : public base {
protected:
void bar() {
cout <<"i'm bar" << endl;
}
public:
derived() {
fn_arr["bar"]=static_cast<fn>(&derived::bar);
}
};
int main() {
derived d;
void (derived::*fn)()=d.fn_arr["foo"];
(d.*fn)();
void (derived::*fn_)()=d.fn_arr["bar"];
(d.*fn_)();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCgpjbGFzcyBiYXNlIHsKICAgCiAgIHByb3RlY3RlZDoKICAgICB0eXBlZGVmIHZvaWQgKGJhc2U6OipmbikoKSA7CiAgICAgYmFzZSgpewogICAgIGZuX2FyclsiZm9vIl09JmJhc2U6OmZvbzsgIAogICAgIH0gIAogICAgIHZvaWQgZm9vKCkgIHsKICAgICAgICBjb3V0IDw8ICJpJ20gZm9vIiA8PCBlbmRsOwogICAgIH0KICAgICAKICAgcHVibGljOgogICAgIG1hcDxzdGQ6OnN0cmluZywgZm4+IGZuX2FycjsKfTsKCmNsYXNzIGRlcml2ZWQgOiBwdWJsaWMgYmFzZSB7CgkKICAgcHJvdGVjdGVkOgogICAgICB2b2lkIGJhcigpIHsKICAgICAgICAgIGNvdXQgPDwiaSdtIGJhciIgPDwgZW5kbDsKICAgICAgfQogICAgICAKICAgcHVibGljOgogICAgICBkZXJpdmVkKCkgewogICAgICAgICAgZm5fYXJyWyJiYXIiXT1zdGF0aWNfY2FzdDxmbj4oJmRlcml2ZWQ6OmJhcik7ICAKICAgICAgfQp9OwoKaW50IG1haW4oKSB7CglkZXJpdmVkIGQ7Cgl2b2lkIChkZXJpdmVkOjoqZm4pKCk9ZC5mbl9hcnJbImZvbyJdOwoJKGQuKmZuKSgpOwoJdm9pZCAoZGVyaXZlZDo6KmZuXykoKT1kLmZuX2FyclsiYmFyIl07CgkoZC4qZm5fKSgpOwoJcmV0dXJuIDA7Cn0=