#include <iostream>
#include <iomanip>
#include <vector>
#include <memory>
#include <functional>
#include <typeinfo>
class Base { public: virtual ~Base() = 0; };
Base::~Base() { }
class Class1 : public Base { };
class Class2 : public Base { };
class ClassN : public Base { };
std::vector<std::function<std::shared_ptr<Base> ()>> CtorList = {
[] { return std::shared_ptr<Base>(new Class1); },
[] { return std::shared_ptr<Base>(new Class2); },
[] { return std::shared_ptr<Base>(new ClassN); },
};
int main()
{
int i;
do
{
std::cout << "input: ";
std::cin >> i;
} while (i >= 3);
auto base = CtorList[i]();
std::cout << typeid(*base).name() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDx0eXBlaW5mbz4KCmNsYXNzIEJhc2UgeyBwdWJsaWM6IHZpcnR1YWwgfkJhc2UoKSA9IDA7IH07CkJhc2U6On5CYXNlKCkgeyB9CgpjbGFzcyBDbGFzczEgOiBwdWJsaWMgQmFzZSB7IH07CmNsYXNzIENsYXNzMiA6IHB1YmxpYyBCYXNlIHsgfTsKY2xhc3MgQ2xhc3NOIDogcHVibGljIEJhc2UgeyB9OwoKc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QmFzZT4gKCk+PiBDdG9yTGlzdCA9IHsKICAgIFtdIHsgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxCYXNlPihuZXcgQ2xhc3MxKTsgfSwKICAgIFtdIHsgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxCYXNlPihuZXcgQ2xhc3MyKTsgfSwKICAgIFtdIHsgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxCYXNlPihuZXcgQ2xhc3NOKTsgfSwKfTsKCmludCBtYWluKCkKewoJaW50IGk7CgoJZG8KCXsKCQlzdGQ6OmNvdXQgPDwgImlucHV0OiAiOwoJCXN0ZDo6Y2luID4+IGk7Cgl9IHdoaWxlIChpID49IDMpOwoKCWF1dG8gYmFzZSA9IEN0b3JMaXN0W2ldKCk7CglzdGQ6OmNvdXQgPDwgdHlwZWlkKCpiYXNlKS5uYW1lKCkgPDwgc3RkOjplbmRsOwp9Cg==