#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();
}