C++
RTTI: информация о времени выполнения
Поиск…
Название типа
Вы можете получить определенное имя реализации типа во время выполнения, используя функцию .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.