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

标签 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<> 是一个模板化对象,因此编译器会忙于转换。 如果我能做类似的事情就好了

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

但这也行不通......有什么想法吗?

最佳答案

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

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

关于c++ - 具有通用模板化基类型的 STL 容器,接受派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36465847/

相关文章:

c# - 展平 IEnumerable<IEnumerable<>>;理解泛型

c# - 使用泛型类型有什么优雅的操作方式吗?

c++ - 右值引用的类型变化

c++ - 如何在编译时判断一个类型是否派生自模板类?

c++ - 模板编译器错误 - 未引用值

javascript - 在这种情况下我应该使用 JavaScript 原型(prototype)吗?

c# - 从静态类调用方法,传递带有泛型的动态变量类型

c++ - 为什么编译器在编译时不知道局部变量的地址?

c++ - HashMap 实现 : --- hashcode

c++ - 将 pimpl 样式类定义编译并链接到库中 (C++)