type_info type c++ c++11 typeid

type_info c++



C++ 11-unicidad tipográfica (4)

Como se indica en cppreference :

Devuelve una cadena de caracteres terminada en nulo definida por la implementación que contiene el nombre del tipo. No se dan garantías, en particular, la cadena devuelta puede ser idéntica para varios tipos y cambiar entre invocaciones del mismo programa.

Entonces, no, no puedes. No puedes asumir nada en realidad.

Aunque, std::type_info::hash_code te da:

size_t hash_code() const noexcept;

7 Devoluciones: Un valor no especificado, excepto que dentro de una sola ejecución del programa, devolverá el mismo valor para cualesquiera dos objetos type_info que comparen iguales.

8 Observación: una implementación debe devolver valores diferentes para dos objetos type_info que no se comparan iguales .

Lo que significa que hash_code() se puede usar para distinguir dos tipos diferentes solo si el operator== para type_info admite.

En C ++ 11, estoy usando esto

typeid(T).name()

para mi propio cálculo hash. No necesito que el resultado sea el mismo entre las ejecuciones del programa o las compilaciones. Solo necesito que sea único para los tipos. Sé que puede devolver el mismo nombre para diferentes tipos, pero generalmente es con const, punteros, etc. En mi caso, T es solo class XY , struct XX o tipos derivados.

En este caso, ¿puedo asumir que T será único?


Debe usar std::type_index para propósitos de mapeo.

La clase type_index es una clase de envoltorio alrededor de un objeto std :: type_info, que se puede usar como índice en contenedores asociativos asociativos y desordenados. La relación con el objeto type_info se mantiene a través de un puntero, por lo tanto, type_index es CopyConstructible y CopyAssignable.


Lo que podría hacer es tomar la dirección de un miembro.

class HashBase { virtual intptr_t get() = 0; }; template <typename T> class Hash : HashBase { static const int _addr = 0; intptr_t get() override { return reinterpret_cast<intptr_t>(&_addr); } };


std::type_info::name está definido por la implementación, por lo que no debe confiar en que sea único para diferentes tipos.

Ya que estás haciendo esto para calcular el hash, deberías usar std::type_info::hash_code en std::type_info::hash_code lugar. Aunque esto no garantiza que los valores sean únicos, el estándar dice que las implementaciones deben intentar y devolver valores diferentes para diferentes tipos. Siempre que la implementación de su mapa hash tenga un manejo razonable de colisiones, esto debería ser suficiente para usted.