#include <iostream>
#include <list>
#include <memory>
#include <string>
class Base {
public:
virtual void bar() const = 0;
};
template <typename T>
class Foo_template : public Base {
T t;
public:
Foo_template(const T& tt) : t(tt) { }
void bar() const override {
std::cout << t << '\n';
}
};
class Foo_list {
std::list<std::unique_ptr<Base>> list;
public:
template <typename T>
void add_to_list(T&& data) {
auto ptr = std::make_unique<Foo_template<T>>(std::forward<T>(data));
list.push_back(std::move(ptr));
}
void bar_all() {
for(auto& elem : list) elem->bar();
}
};
int main() {
Foo_list list;
list.add_to_list(2);
list.add_to_list(std::string{ "Hello, World!" });
list.bar_all();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHN0cmluZz4KCmNsYXNzIEJhc2UgewpwdWJsaWM6Cgl2aXJ0dWFsIHZvaWQgYmFyKCkgY29uc3QgPSAwOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIEZvb190ZW1wbGF0ZSA6IHB1YmxpYyBCYXNlIHsKCVQgdDsKcHVibGljOgoJRm9vX3RlbXBsYXRlKGNvbnN0IFQmIHR0KSA6IHQodHQpIHsgfQoJdm9pZCBiYXIoKSBjb25zdCBvdmVycmlkZSB7CgkJc3RkOjpjb3V0IDw8IHQgPDwgJ1xuJzsKCX0KfTsKCmNsYXNzIEZvb19saXN0IHsKCXN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4+IGxpc3Q7CgkKcHVibGljOgoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cgl2b2lkIGFkZF90b19saXN0KFQmJiBkYXRhKSB7CgkJYXV0byBwdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPEZvb190ZW1wbGF0ZTxUPj4oc3RkOjpmb3J3YXJkPFQ+KGRhdGEpKTsKCQlsaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUocHRyKSk7Cgl9CgkKCXZvaWQgYmFyX2FsbCgpIHsKCQlmb3IoYXV0byYgZWxlbSA6IGxpc3QpIGVsZW0tPmJhcigpOwoJfQp9OwoKaW50IG1haW4oKSB7CglGb29fbGlzdCBsaXN0OwoJbGlzdC5hZGRfdG9fbGlzdCgyKTsKCWxpc3QuYWRkX3RvX2xpc3Qoc3RkOjpzdHJpbmd7ICJIZWxsbywgV29ybGQhIiB9KTsKCWxpc3QuYmFyX2FsbCgpOwp9