Szukaj…


Nazwa typu

Można pobrać nazwę zdefiniowaną dla implementacji typu w środowisku wykonawczym, używając funkcji członkowskiej .name() obiektu std::type_info zwróconego przez typeid .

#include <iostream>
#include <typeinfo>

int main()
{
    int speed = 110;

    std::cout << typeid(speed).name() << '\n';
}

Dane wyjściowe (zdefiniowane w realizacji):

int

dynamic_cast

Użyj funkcji dynamic_cast<>() jako funkcji, która pomaga przerzucić hierarchię dziedziczenia ( opis główny ).

Jeśli musisz wykonać kilka prac niepolimorficznych na niektórych klasach pochodnych B i C , ale otrzymałeś class A podstawową class A , napisz w ten sposób:

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(); 
}

Słowo kluczowe typu

typeid kluczowe typeid jest jednoargumentowym operatorem, który dostarcza informacji o typie operandu w czasie wykonywania, jeśli typ operandu jest typem klasy polimorficznej. Zwraca wartość typu const std::type_info . Kwalifikacje cv najwyższego poziomu są ignorowane.

struct Base {
    virtual ~Base() = default;
};
struct Derived : Base {};
Base* b = new Derived;
assert(typeid(*b) == typeid(Derived{})); // OK

typeid można również zastosować bezpośrednio do typu. W takim przypadku najpierw usuwane są referencje najwyższego poziomu, a następnie kwalifikacja cv najwyższego poziomu jest ignorowana. Tak więc powyższy przykład mógł zostać napisany za pomocą typeid(Derived) zamiast typeid(Derived{}) :

assert(typeid(*b) == typeid(Derived{})); // OK

Jeśli typeid zostanie zastosowany do dowolnego wyrażenia, które nie jest polimorficznym typem klasy, operand nie zostanie oceniony, a zwrócone informacje o typie dotyczą typu statycznego.

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

Kiedy używać, które obsadzono w c ++

Użyj dynamic_cast do konwersji wskaźników / referencji w hierarchii dziedziczenia.

Użyj static_cast do konwersji zwykłego typu.

Użyj reinterpret_cast do reinterpretacji wzorów bitowych na niskim poziomie. Używaj z dużą ostrożnością.

Użyj const_cast do odrzucenia const / volatile. Unikaj tego, chyba że utkniesz przy użyciu niepoprawnego interfejsu API.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow