首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在静态多态中声明基类的std::list?

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

Stack Overflow用户
提问于 2013-10-28 02:09:42
回答 1查看 106关注 0票数 0

快速问一下,当我有一些静态多态类时

代码语言:javascript
复制
template <class Derived>
struct base
{
}

struct derived1 : public base<derived1>{
}

//do the same for derived2, derived3.

如何声明一个包含大量derived1 derive2 derived3对象的std::list?像std::list < base >这样的东西?我想不是,对吧?

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

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2013-10-28 02:13:07

由于使用了CRTP,因此需要为base类模板的所有实例化定义一个公共基类:

代码语言:javascript
复制
class base_base { public: virtual ~base_base() = default; };
template<typename T> class base : public base_base;

其次,你需要额外的间接性,所以你必须使用std::unique_ptr

代码语言:javascript
复制
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,因此您不必自己定义该函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19621520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档