如何"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;
};
一切正常,直到我想将所有 SwitchModule
s 和 TemperatureModule
s 添加到哈希映射。由于我必须将基数 class 用于哈希映射,因此编译器希望我提供 T 和大小。这不起作用:
std::unordered_map<std::string, Module> modulesMap;
有没有聪明的解决方法如何在 unordered_map
中保存 SwitchModule
和 TemperatureModule
?谢谢。
您可以添加一个基 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>());
来自非静态类型语言,我有时会遇到类型限制。
我正在寻找一种将所有对象存储在散列图中的方法。问题是,父 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;
};
一切正常,直到我想将所有 SwitchModule
s 和 TemperatureModule
s 添加到哈希映射。由于我必须将基数 class 用于哈希映射,因此编译器希望我提供 T 和大小。这不起作用:
std::unordered_map<std::string, Module> modulesMap;
有没有聪明的解决方法如何在 unordered_map
中保存 SwitchModule
和 TemperatureModule
?谢谢。
您可以添加一个基 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>());