我正在开发一个库,除其他外,该库允许将POD序列化到文件中,以便稍后加载,我需要一种方法来保留类型。我现在处理此问题的方式是通过模板函数,该函数仅将其地址转换为整数。只要我只运行相同的可执行文件,这就可以正常工作。如果我更改并编译,它将不再返回相同的数字。可能是因为链接器将这些函数放在其他位置,导致返回了另一个地址。
using namespace std;
struct pod1{int a;};
struct pod2{int a;};
struct pod3{int a;};
template <typename T>
uintptr_t getTypeId(){
return reinterpret_cast<uintptr_t>(&getTypeId<T>);
}
int main(){
cout << getTypeId<pod1>() << ", " << getTypeId<pod2>();
return 0;
}
// output 4206048, 4206064
在另一个编译中仅添加第三个pod 使用命名空间std;
struct pod1{int a;};
struct pod2{int a;};
struct pod3{int a;};
template <typename T>
uintptr_t getTypeId(){
return reinterpret_cast<uintptr_t>(&getTypeId<T>);
}
int main(){
cout << getTypeId<pod1>() << ", " << getTypeId<pod2>() << ", " << getTypeId<pod3>();
return 0;
}
// output 4206080, 4206096, 4206112
很显然,添加第三个pod并使用它实例化模板,为其他两个提供不同的类型ID。 我知道这在C ++中是一个遥不可及的问题,但是即使代码发生变化,也有一种方法可以为每种类型生成相同的ID吗?