#include <iostream>
#include <memory>
using namespace std;
struct IParse{
virtual void foo() = 0;
};
struct P1 : IParse{
void foo(){
cout<<"Hi1"<<endl;
}
};
struct P2 : IParse {
void foo(){
cout<<"Hi2"<<endl;
}
};
unique_ptr<IParse> getParser(int x){
switch (x){
case 1:
return unique_ptr<IParse>(new P1());
break;
case 2:
return unique_ptr<IParse>(new P2());
break;
}
return nullptr;
}
int main() {
auto p1(getParser(1));
p1->foo();
auto p2(getParser(2));
p2->foo();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IElQYXJzZXsKCXZpcnR1YWwgdm9pZCAgZm9vKCkgPSAwOwp9OwoKc3RydWN0IFAxIDogSVBhcnNlewoJdm9pZCBmb28oKXsKCQljb3V0PDwiSGkxIjw8ZW5kbDsKCX0KfTsKCnN0cnVjdCBQMiA6IElQYXJzZSB7Cgl2b2lkIGZvbygpewoJCWNvdXQ8PCJIaTIiPDxlbmRsOwoJfQp9OwoKdW5pcXVlX3B0cjxJUGFyc2U+IGdldFBhcnNlcihpbnQgeCl7Cglzd2l0Y2ggKHgpewoJCWNhc2UgMToKCQkJcmV0dXJuIHVuaXF1ZV9wdHI8SVBhcnNlPihuZXcgUDEoKSk7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJcmV0dXJuIHVuaXF1ZV9wdHI8SVBhcnNlPihuZXcgUDIoKSk7CgkJCWJyZWFrOwoJfQoJcmV0dXJuIG51bGxwdHI7Cn0KCmludCBtYWluKCkgewoJYXV0byBwMShnZXRQYXJzZXIoMSkpOwoJcDEtPmZvbygpOwoJCglhdXRvIHAyKGdldFBhcnNlcigyKSk7CglwMi0+Zm9vKCk7CglyZXR1cm4gMDsKfQ==