26 votos

Cuando se está usando "typeid" la mejor solución?

Hay muchas razones para no usar typeid. Aparte de para uso de los miembros de la type_info (definido por la implementación de comportamiento), es por lo general (siempre?) posible para proporcionar una funcionalidad similar utilizando otro lenguaje C++ características, por ejemplo: la sobrecarga de funciones virtuales, etc.

Así, excluyendo el uso que se basa en la implementación de comportamiento definido, ¿alguien tiene un ejemplo del mundo real donde typeid es la mejor solución?

16voto

Konrad Rudolph Puntos 231505

Así, excluyendo el uso que se basa en la implementación de comportamiento definido, ¿alguien tiene un ejemplo del mundo real donde typeid es la mejor solución?

Yo a veces lo uso en los resultados de depuración, para comprobar que una plantilla argumento pasado a mi función es, de hecho, de un tipo dado. Esto tiene sentido en mi caso, ya que la actual plantilla argumento pasado a mi función es generado por una empresa especializada, metafunction y quiero asegurarme de que el derecho metafunction se utiliza.

14voto

Luc Danton Puntos 21421

Cuando la aplicación de multimethods (o varios de envío), donde la llamada es elegido, por ejemplo, de un mapa, utilizando std::type_info* como clave.

13voto

Dennis Zickefoose Puntos 6659

boost::any utiliza typeid a aplicar any_cast.

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

   //...actual cast here...
}

Usted no puede estar seguro de T es polimórfica, por lo dynamic_cast está fuera de la cuestión, y el tipo cerrado dentro de la boost::any llamada se pierde por ahora, así que ninguno de los otros moldes pueden proporcionar cualquier tipo de tipo de seguridad.

7voto

tp1 Puntos 817

Escribir una dinámica árbol donde usted puede en el tiempo de ejecución de modificar la estructura del árbol, donde hay diferentes tipos en cada enlace, tendrá typeid. dynamic_cast no es suficiente.

Edit: he Aquí 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, a continuación, construir un árbol de estos:

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

Con el tipo de enlace, siendo la I* interfaz de... Ya que el anterior funciona para todos los valores de tipo T1,T2,T3,T4, podríamos también con clases similares para las funciones T->T1, T>T2, T->T3, T->T4, y el uso que tipo de función como el Nodo del árbol. Ahora se han apropiado de las expresiones descritas en la dinámica de árbol.

2voto

eran Puntos 12628

Usted puede utilizar typeid para comparar los tipos reales de dos objetos. Podría ser útil si desea comprobar la igualdad de dos objetos, y asegurarse primero de que son del mismo tipo (aunque debo decir que no he visto hace mucho, por lo que podría ser una buena razón de por qué no es una buena idea...).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X