C++
RTTI: Information om körtid
Sök…
Namn på en typ
Du kan hämta det implementeringsdefinierade namnet på en typ under körning genom att använda .name()
för std::type_info
objektet som returneras av typeid
.
#include <iostream>
#include <typeinfo>
int main()
{
int speed = 110;
std::cout << typeid(speed).name() << '\n';
}
Output (implementeringsdefinierad):
int
dynamic_cast
Använd dynamic_cast<>()
som en funktion som hjälper dig att släppa ner genom en arvhierarki ( huvudbeskrivning ).
Om du måste göra något icke-polymorft arbete på vissa härledda klasser B
och C
, men fick basklass class A
, skriv så här:
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();
}
Typid nyckelordet
typeid
nyckelordet är en enhetlig operatör som ger information om körtypstyp om dess operand om operandens typ är en polymorf typ av typ. Det returnerar en lvalue av typen const std::type_info
. Cv-kvalificering på toppnivå ignoreras.
struct Base {
virtual ~Base() = default;
};
struct Derived : Base {};
Base* b = new Derived;
assert(typeid(*b) == typeid(Derived{})); // OK
typeid
kan också appliceras på en typ direkt. I det här fallet avlägsnas första toppnivåreferenser och sedan ignoreras toppnivå cv-kvalificering. Således kan exemplet ovan ha skrivits med typeid(Derived)
istället för typeid(Derived{})
:
assert(typeid(*b) == typeid(Derived{})); // OK
Om typeid
appliceras på något uttryck som inte är av polymorfisk klasstyp, utvärderas inte operanden, och typinfo som returneras är för den statiska typen.
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
När ska man använda vilken cast i c ++
Använd dynamisk utkast för att konvertera pekare / referenser inom en arvhierarki.
Använd static_cast för vanliga typkonverteringar .
Använd reinterpret_cast för låg tolkning av bitmönster på låg nivå. Använd med stor försiktighet.
Använd const_cast för att kasta bort const / volatile. Undvik detta såvida du inte sitter fast med ett felaktigt API.