수색…


유형의 이름

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<>() 를 함수로 사용하면 상속 계층 구조 ( 주 설명 )를 통해 캐스트하는 데 도움이됩니다.

파생 클래스 BC 에서 일부 비 다형성 작업을 수행해야하지만 기본 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를 사용하여 붙어 있지 않는 한 이것을 피하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow