如何"ignore" hashmap的模板参数?

How to "ignore" template parameters for hashmap?

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

我正在寻找一种将所有对象存储在散列图中的方法。问题是,父 class 使用模板作为一些子 classes return 不同大小和类型的数组。

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 添加到哈希映射。由于我必须将基数 class 用于哈希映射,因此编译器希望我提供 T 和大小。这不起作用:

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

有没有聪明的解决方法如何在 unordered_map 中保存 SwitchModuleTemperatureModule?谢谢。

您可以添加一个基 class 并在您的地图中存储指向该基的指针:

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>());