具有通用模板基类型的STL容器,接受派生类型

STL Container with generic templated base type, accepting derived types

本文关键字:类型 容器 STL 派生 基类      更新时间:2023-10-16

我想创建一个具有基本类型EventHandler的映射,但在该映射中插入几个派生的EventHandler,例如:

std::unordered_map<int, EventHandler<Base>*> maap;
EventHandler<Derived>* e1 = new EventHandler<Derived>();
maap.emplace(std::make_pair(1, e1));

这对于简单对象的指针是可能的,但在这里,EventHandler<>是一个模板化的对象,因此编译器在转换时会手忙脚乱。如果我能做一些类似的事情就太好了

template <class T>
std::unordered_map<int, EventHandler<T>> maap;

但这也不起作用。。。有什么想法吗?

我想出了一个解决方案。我创建了一个空的抽象类IEventHandler,并从该类继承了EventHandler。然后我制作了一个IEventHandler*的映射,现在它似乎工作得很好。它可以添加任何类型的EventHandler。我现在需要找到一种方法来确保IEventHandler只由EventHandler继承,并且它只是正确的T类型。

2个小更新:我使用了static_cast来调用EventHandlers方法,因为它是向指针进行强制转换的,所以没有调用额外的复制构造函数^_^我通过给IEventHandler一个私有析构函数和与EventHandler 建立好友关系来限制谁可以从IEventHandler派生