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

时间:2016-04-07 02:48:41

标签: c++ templates generics unordered-map derived

我想用Base类型的EventHandler创建一个映射,但是在这个映射中插入几个派生的EventHandler,如:

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

这可以使用简单对象的指针,但在这里,EventHandler&lt;&gt;是一个模板化的对象,所以编译器正在忙于转换。 如果我可以做像

那样的事情会很好
template <class T>
std::unordered_map<int, EventHandler<T>> maap;

但那也不起作用......有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

2个小更新: 我使用static_cast来调用EventHandlers方法,因为它正在转换为指针,所以没有额外的复制构造函数^ _ ^ 我限制谁可以从IEventHandler派生出来,给它一个私有析构函数和友情链接EventHandler