Где-то при формировании нового стандарта было обещание type_info
использование, которое, среди прочего, привело к реализации hash_code
, Реализуя систему отражения в C ++ 11, я снова столкнулся с проблемой уникальной идентификации типов.
Я нуждаюсь:
Обратите внимание, что мне не нужно постоянство между программами. Как это выглядит:
.name()
абсолютно бесполезен, потому что стандарт не дает никаких гарантий на это вообще..hash_code()
также бесполезен, потому что не гарантированно быть уникальнымtype_info
объект не будет работать везде (например, в DLL).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 мы все еще облажались? : /
Вы можете использование std::type_index
, который может быть построен из std::type_info
, Они полностью упорядочены, реализуя все реляционные операции. type_index
даже неявно конвертируется из type_info
,
Других решений пока нет …