Они не делают этого строго во время компиляции, но эта пара функций автоматически сгенерирует уникальный идентификатор для каждого переданного им типа:
template<class T>
int generate_type_id() {
static int value = 0;
return value++;
}
template<class T>
int type_id() {
static int value = generate_type_id<T>();
return value;
}
И вы должны быть в состоянии гарантировать, что два приложения совместно используют одинаковые идентификаторы для данного типа, явно вызывая функции по порядку в обоих проектах:
type_id<int>();
type_id<Foo>();
type_id< map<string, pair<int, Bar> >();
Да, это заставляет вас писать список всех задействованных типов, но вы можете добавить его в заголовок, #include
между ними, и, по крайней мере, избежать дублирования кода. Это также освобождает вас от необходимости придумывать уникальные идентификаторы для каждого типа самостоятельно, как отвечает ответ Йоханнеса Шауба, хотя его преимущество заключается в том, что он выполняется полностью во время компиляции и, таким образом, статически проверяется компилятором. Я только предлагаю альтернативу.