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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow