Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何";“忽略”;hashmap的模板参数?_C++_Templates_Unordered Map - Fatal编程技术网

C++ 如何";“忽略”;hashmap的模板参数?

C++ 如何";“忽略”;hashmap的模板参数?,c++,templates,unordered-map,C++,Templates,Unordered Map,来自非静态类型语言的我有时会遇到类型约束 我正在寻找一种将所有对象存储在hashmap中的方法。问题是,父类使用模板,因为某些子类返回不同大小和类型的数组 模板 类模块{ 公众: 虚拟std::array getValues()=0; }; 类开关模块:公共模块{ std::array getValues()覆盖; }; 类TemperatureModule:公共模块{ std::array getValues()覆盖; }; 这一切都很好,直到我想将我所有的SwitchModules和Tem

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

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

模板
类模块{
公众:
虚拟std::array getValues()=0;
};
类开关模块:公共模块{
std::array getValues()覆盖;
};
类TemperatureModule:公共模块{
std::array getValues()覆盖;
};
这一切都很好,直到我想将我所有的
SwitchModule
s和
TemperatureModule
s添加到哈希映射。由于我必须为哈希映射使用基类,编译器希望我提供T和Size。这不起作用:

std::无序映射模块映射;

是否有一个巧妙的解决方法,可以在
无序映射中保存
开关模块
温度模块
?谢谢。

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

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;
};
类模块库{
公众:
virtual~ModuleBase()=默认值;
};
模板
类模块:公共模块库{
公众:
虚拟std::array getValues()=0;
};
#包括
// ...
std::无序映射模块映射;
模块映射放置(“foo”,std::make_unique());
ModuleMap.emplace(“bar”,std::make_unique());

您想在地图中存储任何
模块吗?是的,这正是我想做的。也许我应该更改标题。如果您只需要能够存储
SwitchModule
TemperatureModule
,您可以使用
std::variant
。如果您希望能够存储
模块
的任意实例化,那就更麻烦了。
开关模块
温度模块
只是一个简单的示例,我非常希望在映射中保存所有类型的模块。但是谢谢你的提示。你需要
std::variant
或者
std::any
。C++中的容器保持同质对象,但是类模板的不同实例化生成了一组异构的对象。这不是与 STD::Nathover建议的任何< /代码>方法类似吗?这样,在调用
getValues
之前,我仍然必须将
modulemap.find(“foo”)
转换为
SwitchModule
。我想应该有一种方法可以为地图中的每个对象调用
getValues
。@HennyKo是的,这与
getValues
中的
virtual
类似,因为不同的
getValues
返回不同的类型。您可以像使用
std::variant
一样使用
std::visit
,也可以使用
dynamic\u cast
,但仍然需要一些手动操作。好的,谢谢,我想我明白了。这样,我仍然可以保证我的所有模块都具有相同的接口,因为它们仍然是模块的子类。我会测试一下,然后接受答案,但我想这就是我一直在寻找的。谢谢。@HennyKo确定您可以在
地图上使用
*find()
操作符[](
at()
,然后
访问
结果:@HennyKo啊哈,好的,不如果您使用
模块库
/指针方法,您必须
动态转换
(我想——反正我现在想不出一个解决办法)。
#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>());