example - typeinfo c++
¿Por qué usar std:: type_index en lugar de std:: type_info* (2)
Necesito ingresar algunos datos en un mapa por tipo. Actualmente tengo algo como esto:
struct TypeInfoComparer
{
bool operator()(std::type_info const* a, std::type_info const* b) const
{
return a->before(*b);
};
};
std::map<std::type_info const*, Foo, TypeInfoComparer> d_fooByTypeId;
A continuación, puedo <typename T>
de usar (por ejemplo, en un método de plantilla que tiene <typename T>
:
auto pair = d_fooByTypeId.find(&typeid(T));
Sin embargo, hoy estaba leyendo sobre std::type_index
que parece estar destinado a ser utilizado en un caso como este.
Estoy interesado en mejorar mi conocimiento de C ++. ¿Alguien puede explicar si debo modificar mi código para usar std::type_index
y por qué? ¿Hay alguna razón más allá de poder eliminar el TypeInfoComparer
?
No creo que el uso de un puntero al resultado devuelto por typeid(x)
garantice siempre el mismo resultado. En particular, parece problemático garantizar que se devuelva el mismo objeto cuando se utilizan bibliotecas compartidas. El uso previsto de std::type_info
para clasificar es usar el miembro before()
. La clase std::type_index
envuelve esto en una interfaz simoler.
type_index
es "un envoltorio simple para type_info que se puede usar como tipo de índice en contenedores asociativos (23.4) y en contenedores asociativos no ordenados (23.5)". Si usa type_index
lugar de type_info*
, se liberará de tener que proporcionar un comparador explícito en sus mapas. El único costo es que necesita #include <typeindex>
.
Otro beneficio es que te permitirá cambiar a (o también usar) hashmaps (también conocido como unordered_maps).
En general, ya que simplifica su código, yo diría "adelante".