Генерация уникального интегрального идентификатора типа для каждого типа, который согласован между компиляциями - PullRequest
1 голос
/ 07 июля 2019

Я работаю над библиотекой, которая, помимо прочего, позволяет сериализовать 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 ++, но есть ли способ генерировать одинаковые идентификаторы для каждого типа, даже если код изменяется?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...