c++ - 如何“忽略”哈希图的模板参数?
问题描述
来自非静态类型语言,我有时会遇到类型约束。
我正在寻找一种将所有对象存储在哈希图中的方法。问题是,父类使用模板,因为一些子类返回不同大小和类型的数组。
template<typename T, std::size_t Size>
class Module {
public:
virtual std::array<T, Size> getValues() = 0;
};
class SwitchModule : public Module<bool, 2> {
std::array<bool, 2> getValues() override;
};
class TemperatureModule : public Module<float, 4> {
std::array<float, 4> getValues() override;
};
这一切都很好,直到我想将我的所有SwitchModule
s 和TemperatureModule
s 添加到哈希映射中。由于我必须使用哈希映射的基类,编译器希望我提供 T 和 Size。这不起作用:
std::unordered_map<std::string, Module> modulesMap;
是否有一个聪明的解决方法如何保存SwitchModule
和?谢谢你。TemperatureModule
unordered_map
解决方案
您可以添加一个基类并将指向该基类的指针存储在您的地图中:
class ModuleBase {
public:
virtual ~ModuleBase() = default;
};
template<typename T, std::size_t Size>
class Module : public ModuleBase {
public:
virtual std::array<T, Size> getValues() = 0;
};
#include <memory>
// ...
std::unordered_map<std::string, std::unique_ptr<ModuleBase>> modulesMap;
modulesMap.emplace("foo", std::make_unique<SwitchModule>());
modulesMap.emplace("bar", std::make_unique<TemperatureModule>());
推荐阅读
- r - 如何为 stan 数据块指定预测矩阵?
- delphi - Delphi 警告 W1073 结合有符号类型和无符号 64 位类型 - 视为无符号类型
- c++ - 分析C++代码片段(涉及类和函数)
- javascript - 我想在 Chrome 和 Safari 中找到一种语音识别的实现方法,最好使用 vanilla javascript
- vue.js - Vuetify 像移动应用一样打开导航抽屉
- javascript - 像axios一样创建Http客户端请求获取数据
- python - 如何有效地转置 67 gb 文件/Dask 数据帧而不将其完全加载到内存中?
- laravel - 使用子查询为 laravel 中的每条记录分配列值
- service-worker - 是否可以在 PWA 未打开时使用服务人员跟踪地理位置
- group-by - 在 Power BI 上按日期显示类的百分比