#include <iostream>
#include <map>
#include <memory>
struct Base {
virtual ~Base() {} // do not forget this if you need polymorphism
};
template <typename T>
std::unique_ptr<Base> makeBase() { return std::unique_ptr<Base>(new T{}); }
using BaseMaker = std::unique_ptr<Base>(*)();
struct DerivedOne: Base {}; struct DerivedTwo: Base {};
using BaseMakerMap = std::map<std::string, BaseMaker>;
BaseMakerMap const map = { { "DerivedOne", makeBase<DerivedOne> },
{ "DerivedTwo", makeBase<DerivedTwo> } };
std::unique_ptr<Base> makeFromName(std::string const& n) {
BaseMakerMap::const_iterator it = map.find(n);
if (it == map.end()) { return std::unique_ptr<Base>(); } // not found
BaseMaker maker = it->second;
return maker();
}
int main() {
makeFromName("DerivedOne");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IEJhc2UgewogICAgdmlydHVhbCB+QmFzZSgpIHt9IC8vIGRvIG5vdCBmb3JnZXQgdGhpcyBpZiB5b3UgbmVlZCBwb2x5bW9ycGhpc20KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4gbWFrZUJhc2UoKSB7IHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4obmV3IFR7fSk7IH0KCnVzaW5nIEJhc2VNYWtlciA9IHN0ZDo6dW5pcXVlX3B0cjxCYXNlPigqKSgpOwoKc3RydWN0IERlcml2ZWRPbmU6IEJhc2Uge307IHN0cnVjdCBEZXJpdmVkVHdvOiBCYXNlIHt9OwoKdXNpbmcgQmFzZU1ha2VyTWFwID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIEJhc2VNYWtlcj47CgpCYXNlTWFrZXJNYXAgY29uc3QgbWFwID0geyB7ICJEZXJpdmVkT25lIiwgbWFrZUJhc2U8RGVyaXZlZE9uZT4gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAiRGVyaXZlZFR3byIsIG1ha2VCYXNlPERlcml2ZWRUd28+IH0gfTsKCnN0ZDo6dW5pcXVlX3B0cjxCYXNlPiBtYWtlRnJvbU5hbWUoc3RkOjpzdHJpbmcgY29uc3QmIG4pIHsKICAgIEJhc2VNYWtlck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXAuZmluZChuKTsKCiAgICBpZiAoaXQgPT0gbWFwLmVuZCgpKSB7IHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4oKTsgfSAvLyBub3QgZm91bmQKCiAgICBCYXNlTWFrZXIgbWFrZXIgPSBpdC0+c2Vjb25kOwoKICAgIHJldHVybiBtYWtlcigpOwp9CgppbnQgbWFpbigpIHsKCW1ha2VGcm9tTmFtZSgiRGVyaXZlZE9uZSIpOwoJcmV0dXJuIDA7Cn0=