C++
RTTI: Información de tipo de tiempo de ejecución
Buscar..
Nombre de un tipo
Puede recuperar el nombre definido por la implementación de un tipo en tiempo de ejecución utilizando la función miembro .name()
del objeto std::type_info
devuelto por typeid
.
#include <iostream>
#include <typeinfo>
int main()
{
int speed = 110;
std::cout << typeid(speed).name() << '\n';
}
Salida (definida por la implementación):
int
dynamic_cast
Utilice dynamic_cast<>()
como una función, que le ayuda a reducir a través de una jerarquía de herencia ( descripción principal ).
Si debe realizar algún trabajo no polimórfico en algunas clases derivadas B
y C
, pero recibió la class A
base class A
, escriba de esta forma:
class A { public: virtual ~A(){} };
class B: public A
{ public: void work4B(){} };
class C: public A
{ public: void work4C(){} };
void non_polymorphic_work(A* ap)
{
if (B* bp =dynamic_cast<B*>(ap))
bp->work4B();
if (C* cp =dynamic_cast<C*>(ap))
cp->work4C();
}
La palabra clave typeid
La palabra clave typeid
es un operador unario que proporciona información de tipo de tiempo de ejecución sobre su operando si el tipo de operando es un tipo de clase polimórfica. Devuelve un lvalue de tipo const std::type_info
. Se ignora la calificación cv de nivel superior.
struct Base {
virtual ~Base() = default;
};
struct Derived : Base {};
Base* b = new Derived;
assert(typeid(*b) == typeid(Derived{})); // OK
typeid
también se puede aplicar a un tipo directamente. En este caso, las primeras referencias de nivel superior se eliminan, luego se ignora la calificación cv de nivel superior. Por lo tanto, el ejemplo anterior podría haberse escrito con typeid(Derived)
lugar de typeid(Derived{})
:
assert(typeid(*b) == typeid(Derived{})); // OK
Si se aplica typeid
a cualquier expresión que no sea del tipo de clase polimórfica, el operando no se evalúa, y la información de tipo devuelta es para el tipo estático.
struct Base {
// note: no virtual destructor
};
struct Derived : Base {};
Derived d;
Base& b = d;
assert(typeid(b) == typeid(Base)); // not Derived
assert(typeid(std::declval<Base>()) == typeid(Base)); // OK because unevaluated
Cuándo usar el que está en c ++
Utilice dynamic_cast para convertir punteros / referencias dentro de una jerarquía de herencia.
Utilice static_cast para conversiones de tipo ordinario.
Utilice reinterpret_cast para la reinterpretación de bajo nivel de patrones de bits. Utilizar con extrema precaución.
Use const_cast para desechar const / volatile. Evita esto a menos que estés atascado usando una API const-incorrect.