如何在静态多态中声明基类的std :: list?

时间:2013-10-27 18:09:42

标签: c++ templates polymorphism

快速问题,当我有一些静态多态性类

template <class Derived>
struct base
{
}

struct derived1 : public base<derived1>{
}

//do the same for derived2, derived3.

如何声明一个包含很多derived1 derive2 derived3对象的std :: list?像std :: list&lt;基数&gt; ?我猜不是,对吧?

PS:显然在运行时会选择派生类,我需要在运行时访问派生类的功能。

感谢很多!

1 个答案:

答案 0 :(得分:0)

由于您使用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,因此您不必自己定义该功能。