Где-то при формировании нового стандарта было обещано более легкое использование type_info
, что, среди прочего, привело к реализации hash_code
. Однако при реализации системы отражения в C++11 я снова столкнулся с проблемой уникальной идентификации типа.
Я нуждаюсь:
- Что-то, что позволит мне извлечь из типа уникальный идентификатор typeid
- Уникальный идентификатор должен иметь возможность использоваться в контейнере ключ/значение.
- Идентификатор не должен быть переносимым или даже одинаковым между выполнениями программы.
Обратите внимание, что мне не нужно постоянство между запусками программы. Как это выглядит:
.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 мы все еще облажались? :/
hash_code
. - person Nicol Bolas   schedule 01.06.2013type_info
? - person Nicol Bolas   schedule 01.06.2013type_info
для этого? Почему вы не можете использовать его в качестве ключа вunordered_map
? - person Nicol Bolas   schedule 01.06.2013