如何“忽略”哈希图的模板参数?

Posted

技术标签:

【中文标题】如何“忽略”哈希图的模板参数?【英文标题】:How to "ignore" template parameters for hashmap? 【发布时间】:2021-01-25 22:11:40 【问题描述】:

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

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

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;

是否有巧妙的解决方法将SwitchModuleTemperatureModule 保存在unordered_map 中?谢谢。

【问题讨论】:

您希望能够在地图中存储任何Module&lt;T,Value&gt; 是的,这正是我想要做的。也许我应该改一下标题。 如果您需要能够存储SwitchModuleTemperatureModule,您可以使用std::variant。如果您希望能够存储Module 的任意实例,那就更麻烦了。 SwitchModuleTemperatureModule 只是我真正想要的一个简单示例,因此将所有类型的模块保存在地图中。不过谢谢你的提示。 那么您将需要std::variantstd::any。 C++ 中的容器包含同质对象,但类模板的不同实例化会生成一组异构对象。 【参考方案1】:

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

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

【讨论】:

这不是类似于 NathanOliver 建议的std::any 方法吗?这样我仍然必须将modulesMap.find("foo") 转换为SwitchModule,然后才能调用getValues。我认为有一种方法可以为地图中的每个对象调用getValues @HennyKo 是的,它很相似,不,你不能在MoudleBase 中将getValues 作为virtual,因为不同的getValues 返回不同的类型。你可以使用std::visitstd::variant 一样,也可以使用dynamic_cast,但是仍然需要一些手动操作。 好的,谢谢,我想我明白了。这样我仍然可以保证我的所有模块都具有相同的接口,因为它们仍然是模块的子类。我会对此进行测试,然后接受答案,但我认为这就是我想要的。谢谢。 @HennyKo 当然你可以在你的map 上使用*find()operator[]()at() 然后visit 结果:example @HennyKo 啊哈,好吧,不,如果你使用ModuleBase / 指针方法,你将不得不使用dynamic_cast(我想 - 我现在想不出办法解决它)。 example

以上是关于如何“忽略”哈希图的模板参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何逐行编写 EDN? (吐,哈希图的序列)

如何在 javascript 中检查此布尔哈希图是不是为空? [复制]

如何从它们插入哈希图中的顺序打印哈希图值

如何将哈希图转换为条目数组[重复]

(Kotlin)如何将哈希图输出保存到文件中

如何按整数值对哈希图进行排序[重复]