C++ 将类型映射到整数值后,如何在给定整数值的情况下恢复该类型?
我试图构建这个实体组件系统,我有一个模板化的容器类,我用它来存储所有组件类型,对于每个传递的类型,下面的代码负责将类型映射到一个索引,这样我就可以使用它作为std::map的键(其中的值是指向“vector”的指针)。因此,例如,调用C++ 将类型映射到整数值后,如何在给定整数值的情况下恢复该类型?,c++,C++,我试图构建这个实体组件系统,我有一个模板化的容器类,我用它来存储所有组件类型,对于每个传递的类型,下面的代码负责将类型映射到一个索引,这样我就可以使用它作为std::map的键(其中的值是指向“vector”的指针)。因此,例如,调用typeId()可能会返回一个值2,假设typeId类在使用其他模板参数之前被实例化了2次: #pragma一次 使用uInt=size\u t; 类类型数据库 { 私人: 静态uInt internal_generateTypeID(){ 静态uInt类型计数器{
typeId()
可能会返回一个值2,假设typeId类在使用其他模板参数之前被实例化了2次:
#pragma一次
使用uInt=size\u t;
类类型数据库
{
私人:
静态uInt internal_generateTypeID(){
静态uInt类型计数器{};
返回类型idcounter++;
}模板好友类typeId;
};
模板
类类型ID{
公众:
运算符uInt()常量{return id;}
私人:
静态内联uInt id=typeIdBase::internal_generateTypeID();
};
问题是,现在我还需要走相反的方向,我需要返回一个给定size\u t值的类型,因此,例如在我的代码typename idType::type
中,应该给出与键入RectComponent
等效的值。
在上面的示例中,RectComponent与值2关联,typeId()
也应该返回2
,这只是为了说明一下。
我被卡住了,不知道怎么去,有什么建议吗 当你这么做的时候
typeId<typename idType<2>::type>()
typeId()
您要求编译器使用编译时未知的模板参数值实例化模板。这在C++中是行不通的。模板只是编译器的代码蓝图,对于它们实例化的每一组不同参数,都有一个版本的模板化代码,其中包含在翻译单元中实际编译的具体类型。在运行时,这些模板都不存在,您只有不同的实例化版本,仅此而已
因此,这种类型的实现无法工作。根据您的实际问题,您必须在编译时提供这样的映射,或者找到替代解决方案。您应该非常小心使用静态初始值设定项,如示例中所示,因为给定类型的id在编译期间可能会更改 不幸的是,无法将索引映射回已注释的@user253751类型 因为您声明要使用索引作为映射的键,所以我建议您改为使用 这允许您将该类型直接用作映射的键。 如果要存储给定类型的小部件数组,可以使用以下内容:
#包括
#包括
#包括
#包括
#包括
#包括
类WidgetMap{
公众:
模板
void addWidget(常量T&val){
auto-idx=std::type_索引(typeid(T));
if(m_map.find(idx)=m_map.end())
m_map[idx]=std::make_shared();
auto-vecPtr=std::static_-pointer_-cast(m_-map[idx]);
vecPtr->推回(val);
}
模板
std::shared_ptr getWidgets(){
auto-idx=std::type_索引(typeid(T));
autoit=m_map.find(idx);
if(it==m_map.end())
抛出std::runtime_错误(std::string{“没有为类型存储小部件”}+typeid(T.name());
返回std::static\u pointer\u cast(它->秒);
}
私人:
std::map mu map;
};
然后,您可以使用小部件类型作为键:
struct-ExampleWidget{
std::字符串消息;
};
//用法:
WidgetMap;
//添加小部件
m、 addWidget(例如Widget{“Hello”});
m、 addWidget(例如Widget{“世界”});
//按类型检索小部件
auto-exampleWidgets=m.getWidgets();
用于(自动和val:*示例小部件)
我想,我不能用这个把戏。你需要在某处写出所有的类型和数字。或者制作一个脚本来生成它们。这是我的代码已经可以做的,我可以做getVector()
并得到一个向量,在这个对应的例子中我需要的是一个std::type\u index
它应该给我一个对应的类型。因为如果你想象一个实体有一个只存储组件id的std::map componentsId
,当然,如果需要的话,我希望能够访问特定的组件,但在销毁时,我需要一个循环槽的范围,该映射可以将type_索引转换为正确的类型,以便访问正确的向量并删除组件。