C++
RTTI : 런타임 유형 정보
수색…
유형의 이름
typeid
반환 한 std::type_info
객체의 .name()
멤버 함수를 사용하여 런타임에 유형 정의 구현 이름을 검색 할 수 있습니다.
#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
키워드 는 피연산자 유형이 다형 클래스 유형 인 경우 피연산자에 대한 런타임 정보를 생성하는 단항 연산자입니다. const std::type_info
형식의 lvalue를 반환합니다. 최상위 수준의 자격 증명은 무시됩니다.
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_cast 를 사용하십시오. 당신이 const가 잘못된 API를 사용하여 붙어 있지 않는 한 이것을 피하십시오.