Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ 将类型映射到整数值后,如何在给定整数值的情况下恢复该类型?_C++ - Fatal编程技术网

C++ 将类型映射到整数值后,如何在给定整数值的情况下恢复该类型?

C++ 将类型映射到整数值后,如何在给定整数值的情况下恢复该类型?,c++,C++,我试图构建这个实体组件系统,我有一个模板化的容器类,我用它来存储所有组件类型,对于每个传递的类型,下面的代码负责将类型映射到一个索引,这样我就可以使用它作为std::map的键(其中的值是指向“vector”的指针)。因此,例如,调用typeId()可能会返回一个值2,假设typeId类在使用其他模板参数之前被实例化了2次: #pragma一次 使用uInt=size\u t; 类类型数据库 { 私人: 静态uInt internal_generateTypeID(){ 静态uInt类型计数器{

我试图构建这个实体组件系统,我有一个模板化的容器类,我用它来存储所有组件类型,对于每个传递的类型,下面的代码负责将类型映射到一个索引,这样我就可以使用它作为std::map的键(其中的值是指向“vector”的指针)。因此,例如,调用
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_索引转换为正确的类型,以便访问正确的向量并删除组件。