具有通用模板化基类型的 STL 容器,接受派生类型
STL Container with generic templated base type, accepting derived types
我想创建一个带有 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;
但这也不管用...有什么想法吗?
我想出了一个解决方案。我制作了一个空的摘要 class IEventHandler 并从那个 class 继承了 EventHandler。然后我制作了一个 IEventHandler* 的映射,它现在似乎工作正常。它可以添加任何类型的 EventHandler。我现在需要找到一种方法来确保 IEventHandler 仅由 EventHandler 继承,并且它只是正确的 T 类型。
2 条小更新:
我使用 static_cast 来调用 EventHandlers 方法,因为它正在转换为指针,所以没有额外的复制构造函数调用 ^_^
我通过给 IEventHandler 一个私有析构函数和友好的 EventHandler
来限制谁可以派生自 IEventHandler
我想创建一个带有 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;
但这也不管用...有什么想法吗?
我想出了一个解决方案。我制作了一个空的摘要 class IEventHandler 并从那个 class 继承了 EventHandler。然后我制作了一个 IEventHandler* 的映射,它现在似乎工作正常。它可以添加任何类型的 EventHandler。我现在需要找到一种方法来确保 IEventHandler 仅由 EventHandler 继承,并且它只是正确的 T 类型。
2 条小更新: 我使用 static_cast 来调用 EventHandlers 方法,因为它正在转换为指针,所以没有额外的复制构造函数调用 ^_^ 我通过给 IEventHandler 一个私有析构函数和友好的 EventHandler
来限制谁可以派生自 IEventHandler