#include <iostream>
#include <typeinfo>
#include <unordered_map>
using namespace std;
struct base { base(){} virtual ~base(){} };
struct A:public base { A(){} };
struct B:public base { B(){} };
struct C:public base { C(){} };
typedef base *Creaton();
template<class T> base *creaton() { return new T; };
int main()
{
unordered_map<string,Creaton*> tb={{{"a",creaton<A>},{"b",creaton<B>},{"c",creaton<C>}}};
base *tmp;
tmp=tb["b"]();
cout<<typeid(*tmp).name()<<endl;
delete tmp;
tmp=tb["a"]();
cout<<typeid(*tmp).name()<<endl;
delete tmp;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGJhc2UgeyBiYXNlKCl7fSB2aXJ0dWFsIH5iYXNlKCl7fSB9OwpzdHJ1Y3QgQTpwdWJsaWMgYmFzZSB7IEEoKXt9IH07CnN0cnVjdCBCOnB1YmxpYyBiYXNlIHsgQigpe30gfTsKc3RydWN0IEM6cHVibGljIGJhc2UgeyBDKCl7fSB9Owp0eXBlZGVmIGJhc2UgKkNyZWF0b24oKTsKdGVtcGxhdGU8Y2xhc3MgVD4gYmFzZSAqY3JlYXRvbigpIHsgcmV0dXJuIG5ldyBUOyB9OwoKaW50IG1haW4oKQogIHsKICAgdW5vcmRlcmVkX21hcDxzdHJpbmcsQ3JlYXRvbio+IHRiPXt7eyJhIixjcmVhdG9uPEE+fSx7ImIiLGNyZWF0b248Qj59LHsiYyIsY3JlYXRvbjxDPn19fTsKICAgYmFzZSAqdG1wOwogICAKICAgdG1wPXRiWyJiIl0oKTsKICAgY291dDw8dHlwZWlkKCp0bXApLm5hbWUoKTw8ZW5kbDsKICAgZGVsZXRlIHRtcDsKCiAgIHRtcD10YlsiYSJdKCk7CiAgIGNvdXQ8PHR5cGVpZCgqdG1wKS5uYW1lKCk8PGVuZGw7CiAgIGRlbGV0ZSB0bXA7CiAgIAogICByZXR1cm4gMDsKICB9