type_info c++ typeid

c++ - type_info - ¿Cuándo está usando ''typeid'' la mejor solución?



type_info c++ (6)

Entonces, al excluir el uso que se basa en el comportamiento definido de la implementación, ¿alguien tiene un ejemplo del mundo real en el que el tipo de letra sea la mejor solución?

A veces lo uso en salidas de depuración, para verificar que un argumento de plantilla pasado a mi función sea de un tipo dado. Esto tiene sentido en mi caso, ya que el argumento de plantilla real pasado a mi función es generado por una metafunción especializada y quiero asegurarme de que se usa la metafunción correcta.

Hay muchas razones para no usar typeid . Además de usar miembros de type_info (comportamiento definido por la implementación), generalmente (¿siempre?) Es posible proporcionar una funcionalidad similar utilizando otras funciones del lenguaje C ++, por ejemplo: sobrecarga, funciones virtuales, etc.

Entonces, al excluir el uso que se basa en el comportamiento definido de la implementación, ¿alguien tiene un ejemplo del mundo real en el que el tipo de typeid sea ​​la mejor solución?


Al implementar métodos múltiples (o envío múltiple), donde la llamada real se elige de, por ejemplo, un mapa, utilizando std::type_info* como clave.


Escriba un árbol dinámico donde pueda modificar la estructura en tiempo de ejecución del árbol en el que hay diferentes tipos en cada enlace, necesitará tipografía. dynamic_cast no es suficiente.

Edición: Aquí hay algunos detalles:

class I { public: virtual std::string type() const=0; virtual void *value() const=0; }; template<class T> class Impl : public I { public: Impl(T t) : t(t) { } std::string type() const { return typeid(T).name(); } void *value() const { return &t; } private: T t; };

Y luego construye un árbol a partir de estos:

template<class Node, class Link> class Tree { };

Dado que el tipo de enlace es la interfaz I * ... Dado que lo anterior funciona para cualquier valor de tipo T1, T2, T3, T4, también podríamos con clases similares para cualquier función T-> T1, T-> T2, T-> T3, T-> T4, y use ese tipo de función como el nodo del árbol. Ahora tienes expresiones propias descritas en el árbol dinámico.


Lo uso para probar el tipo de clase de la excepción en mi controlador catch all.

// fudge vtable existence (thrown exceptions must have one) class StubException { virtual ~StubException(); }; ..... catch(...) { StubException *e = getExceptionObject(); // compiler/rt specific std::string s = typeid(e).name(); ... throw; }

La función getExceptionObject() es parte de una pequeña biblioteca de utilidades en la que me equivoco al acceder a información adicional sobre excepciones. Es muy útil cuando una función lanza una excepción que debería ser capturada pero no. Definitivamente ha ahorrado mucha frustración con los años, ya que de inmediato sé el tipo de excepción que necesita cobertura.


Puede usar typeid para comparar los tipos reales de dos objetos. Podría ser útil si quiere verificar la igualdad de dos objetos, y primero asegúrese de que sean exactamente del mismo tipo (aunque debo decir que no he visto mucho esto hecho, así que puede haber una buena razón para que esto no sea así). una buena idea...).


boost::any uso de typeid para implementar any_cast .

template<typename T> any_cast(const any& other) { if(typeid(T) != other.type()) throw bad_any_cast(); //...actual cast here... }

No puede estar seguro de que T es polimórfico, por lo que dynamic_cast está fuera de cuestión, y el tipo adjunto dentro del boost::any se perdió boost::any llamada, por lo que ninguno de los otros lanzamientos puede proporcionar ningún tipo de seguridad.