Самый безопасный способ уникальной идентификации типов в C ++ 11

Где-то при формировании нового стандарта было обещание type_info использование, которое, среди прочего, привело к реализации hash_code, Реализуя систему отражения в C ++ 11, я снова столкнулся с проблемой уникальной идентификации типов.

Я нуждаюсь:

  1. Что-то, что позволит мне извлечь из типа, используя typeid уникальный идентификатор
  2. Уникальный идентификатор должен быть в состоянии использовать в контейнере ключ / значение
  3. Идентификатор не должен быть переносимым или даже одинаковым между выполнениями программы

Обратите внимание, что мне не нужно постоянство между программами. Как это выглядит:

  1. .name() абсолютно бесполезен, потому что стандарт не дает никаких гарантий на это вообще.
  2. .hash_code() также бесполезен, потому что не гарантированно быть уникальным
  3. Взяв указатель на type_info объект не будет работать везде (например, в DLL)
  4. Только .before() кажется полезным — хотя я не знаю, пострадает ли он от той же проблемы, что и № 3

Даже если .before() должен быть использован, то мы можем использовать mapпока я бы предпочел использовать unordered_map,

struct compare_type_info {
bool operator ()(const type_info* a, const type_info* b) const {
return a->before(*b);
}
};
std::map<const type_info*, X, compare_type_info> map;
m[&typeid(int)] = something;

Вышеуказанное безопасно для столкновения? Гарантирует ли оператор заказа перезапись!< а!> значения?

Есть ли способ решить эту проблему без риска коллизии хеша?

С точки зрения сворачивания моей собственной системы типов, я уже делаю это, но typeid решает проблемы с указанием правильного конечного типа из базового типа (наследование), и я не хочу добавлять какие-либо поля в мои классы (система типов является «внешней»).

Даже в C ++ 11 мы все еще облажались? : /

5

Решение

Вы можете использование std::type_index, который может быть построен из std::type_info, Они полностью упорядочены, реализуя все реляционные операции. type_index даже неявно конвертируется из type_info,

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]