Я работаю над библиотекой, которая, помимо прочего, позволяет сериализовать POD в файл для последующей загрузки, и мне нужен способ сохранить тип.Теперь я могу обработать это с помощью функции шаблона, которая просто возвращает свой адрес, приведенный к типу int.Это прекрасно работает, пока я запускаю только один и тот же исполняемый файл.Если я что-то изменяю и компилирую, он больше не возвращает тот же номер.Возможно, потому что компоновщик разместил эти функции где-то еще, что приводит к возвращению другого адреса.
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
в другой компиляции с добавлением только третьего модуля с использованием пространства имен 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
Очевидно,добавление третьего модуля и создание шаблона с ним дает разные идентификаторы типа для двух других.Я знаю, что это длинный путь в C ++, но есть ли способ генерировать одинаковые идентификаторы для каждого типа, даже если код изменяется?