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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow