由于您使用 CRTP,因此您需要为base
类模板的所有实例定义一个公共基类:
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
,因此您不必自己定义该函数。