为编译之间一致的每种类型生成唯一的整数类型ID

时间:2019-07-07 20:40:25

标签: c++ c++11 templates

我正在开发一个库,除其他外,该库允许将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吗?

0 个答案:

没有答案