首页 > 解决方案 > 如何“忽略”哈希图的模板参数?

问题描述

来自非静态类型语言,我有时会遇到类型约束。

我正在寻找一种将所有对象存储在哈希图中的方法。问题是,父类使用模板,因为一些子类返回不同大小和类型的数组。

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;
};

这一切都很好,直到我想将我的所有SwitchModules 和TemperatureModules 添加到哈希映射中。由于我必须使用哈希映射的基类,编译器希望我提供 T 和 Size。这不起作用:

std::unordered_map<std::string, Module> modulesMap;

是否有一个聪明的解决方法如何保存SwitchModule和?谢谢你。TemperatureModuleunordered_map

标签: c++templatesunordered-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>());

推荐阅读