base
CRTP を使用するため、クラス テンプレートのすべてのインスタンス化に対して共通の基本クラスを定義する必要があります。
class base_base { public: virtual ~base_base() = default; };
template<typename T> class base : public base_base;
次に、追加の間接化が必要なので、 を使用する必要がありますstd::unique_ptr
。
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
std::list<std::unique_ptr<base>> my_list;
my_list.emplace_back(make_unique<derived1>());
my_list.emplace_back(make_unique<derived2>());
my_list.emplace_back(make_unique<derived3>());
C++14 では、ほとんどの場合 を使用できるためstd::make_unique
、その関数を自分で定義する必要はありません。