Поиск…


Название типа

Вы можете получить определенное имя реализации типа во время выполнения, используя функцию .name() члена объекта std::type_info возвращаемого typeid .

#include <iostream>
#include <typeinfo>

int main()
{
    int speed = 110;

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

Выход (определенный реализацией):

int

dynamic_cast

Используйте функцию dynamic_cast<>() как функцию, которая поможет вам сбрасывать иерархию наследования ( основное описание ).

Если вы должны выполнить некоторую неполиморфную работу над некоторыми производными классами B и C , но получили базовый class A , напишите так:

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

Ключевое слово typeid

typeid слово typeid является унарным оператором, который дает информацию типа времени выполнения о ее операнде, если тип операнда является полиморфным типом класса. Он возвращает lvalue типа const std::type_info . Квалификация верхнего уровня игнорируется.

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

typeid также может применяться к типу напрямую. В этом случае первые ссылки верхнего уровня удаляются, тогда верхняя степень cv-квалификации игнорируется. Таким образом, приведенный выше пример мог быть написан с помощью typeid(Derived) вместо typeid(Derived{}) :

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

Если typeid применяется к любому выражению, которое не относится к типу полиморфного класса, операнд не оценивается, а возвращаемая информация типа - для статического типа.

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

Когда использовать, какой листинг в c ++

Используйте dynamic_cast для преобразования указателей / ссылок в иерархию наследования.

Используйте static_cast для конверсий обычного типа.

Используйте reinterpret_cast для низкоуровневого переинтерпретации битовых шаблонов. Используйте с особой осторожностью.

Используйте const_cast для отбрасывания const / volatile. Избегайте этого, если вы не застряли с использованием некорректного API.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow