具有通用模板基类型的STL容器,接受派生类型
STL Container with generic templated base type, accepting derived types
我想创建一个具有基本类型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派生
相关文章:
- 检查函数返回类型是否与STL容器类型值相同
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 如何使用模板根据类型将元素添加到各种容器中
- 嵌套模板函数采用 2 个具有相同内部类型的容器
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 如何在容器中指定模板化别名的泛型类型
- 使用概念对具有特定值类型的任何容器进行 C++ 迭代
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- 如何实现一个接受任何容器类型的函数
- C++是否有一个容器,每个类型最多存储一个对象
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?
- 如何在使用容器和字符串时强制使用显式分配器类型参数
- 在 stl 容器包装器中定义迭代器类型
- 可以在 stl 容器上完成非类型模板参数吗?
- 如何从包含基类指针的容器中调用派生类函数(基于其类型)?
- 将 Eigen::MatrixXd 矩阵转换为 cgal 容器类型
- 游戏项目的多对象类型容器或动态铸造
- const类型容器的const_iterator类型
- 使用不同类型容器的迭代器范围初始化容器