#include <iostream>
#include <string>
#include <memory>
#include <vector>
using namespace std;
class Animal {
public:
virtual ~Animal() {}
virtual void PrintName() = 0;
protected:
string mName;
};
class Cat : public Animal {
public:
Cat(const string& inName)
{
mName = inName;
}
void PrintName() final {
cout << "this is a " << mName << endl;
}
};
class Dog : public Animal {
public:
Dog(const string& inName)
{
mName = inName;
}
void PrintName() final {
cout << "this is a " << mName << endl;
}
};
vector<unique_ptr<Animal>> MyAnimal;
template <class tDerived, class...tConstructArgs>
tDerived* AddAnimal(tConstructArgs&&... inArgs)
{
auto theanimal = make_unique<tDerived>(forward<tConstructArgs>(inArgs)...);
auto result = theanimal.get();
MyAnimal.push_back(move(theanimal));
return result;
};
int main() {
// your code goes here
auto thepet = AddAnimal<Cat>("my cat");
thepet->PrintName();
for(const auto& pet:MyAnimal)
{
pet->PrintName();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQW5pbWFsIHsKcHVibGljOgogICAgdmlydHVhbCB+QW5pbWFsKCkge30KICAgIHZpcnR1YWwgdm9pZCBQcmludE5hbWUoKSA9IDA7CnByb3RlY3RlZDoKICAgIHN0cmluZyBtTmFtZTsKfTsKCmNsYXNzIENhdCA6IHB1YmxpYyBBbmltYWwgewpwdWJsaWM6CiAgICBDYXQoY29uc3Qgc3RyaW5nJiBpbk5hbWUpCiAgICB7CiAgICAgICAgbU5hbWUgPSBpbk5hbWU7CiAgICB9CiAgICB2b2lkIFByaW50TmFtZSgpIGZpbmFsIHsKICAgICAgICBjb3V0IDw8ICJ0aGlzIGlzIGEgIiA8PCBtTmFtZSA8PCBlbmRsOwogICAgfQp9OwoKY2xhc3MgRG9nIDogcHVibGljIEFuaW1hbCB7CnB1YmxpYzoKICAgIERvZyhjb25zdCBzdHJpbmcmIGluTmFtZSkKICAgIHsKICAgICAgICBtTmFtZSA9IGluTmFtZTsKICAgIH0KICAgIHZvaWQgUHJpbnROYW1lKCkgZmluYWwgewogICAgICAgIGNvdXQgPDwgInRoaXMgaXMgYSAiIDw8IG1OYW1lIDw8IGVuZGw7CiAgICB9Cn07Cgp2ZWN0b3I8dW5pcXVlX3B0cjxBbmltYWw+PiBNeUFuaW1hbDsKCnRlbXBsYXRlIDxjbGFzcyB0RGVyaXZlZCwgY2xhc3MuLi50Q29uc3RydWN0QXJncz4KdERlcml2ZWQqIEFkZEFuaW1hbCh0Q29uc3RydWN0QXJncyYmLi4uIGluQXJncykKewoJYXV0byB0aGVhbmltYWwgPSBtYWtlX3VuaXF1ZTx0RGVyaXZlZD4oZm9yd2FyZDx0Q29uc3RydWN0QXJncz4oaW5BcmdzKS4uLik7CglhdXRvIHJlc3VsdCA9IHRoZWFuaW1hbC5nZXQoKTsKCU15QW5pbWFsLnB1c2hfYmFjayhtb3ZlKHRoZWFuaW1hbCkpOwoJcmV0dXJuIHJlc3VsdDsKfTsKCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJYXV0byB0aGVwZXQgPSBBZGRBbmltYWw8Q2F0PigibXkgY2F0Iik7Cgl0aGVwZXQtPlByaW50TmFtZSgpOwoJZm9yKGNvbnN0IGF1dG8mIHBldDpNeUFuaW1hbCkKCXsKCQlwZXQtPlByaW50TmFtZSgpOwoJfQoJcmV0dXJuIDA7Cn0=