C + + 11 | 런 타임 형식 인식 (RTTI)

4161 단어 C/C++
C + + 11 의 RTTI 가 더 좋 습 니 다. 여기 참조:http://en.cppreference.com/w/cpp/types。RTTI 와 관련 된 몇 가지 유형 과 방법 이 있 습 니 다.
  • type_info 클래스
  • typeid 연산 자
  • type_index 클래스
  • type_info
    type_info 클래스 는 헤더 파일 에서 정의 되 며, C + + 형식의 관련 정 보 를 대표 합 니 다.일반적으로 typeid 연산 자 에서 되 돌아 오 며 스스로 구성 할 수 없습니다.
    type_info 는 관련 된 것 입 니 다. 서로 다른 컴 파일 도구 체인 의 실현 이 일치 하지 않 을 수 있 습 니 다.
    다음 코드 는 int 형식의 이름 을 출력 할 수 있 습 니 다:
        const std::type_info &tiInt = typeid(int);
        std::cout << "tiInt.name = " << tiInt.name() << std::endl;

    type_info 는 다음 과 같은 방법 이 있 습 니 다:
  • name (), 형식의 이름 되 돌려 주기
  • hash_code (), 이 유형의 해시 값 을 되 돌려 줍 니 다 (유일 성 있 음)
  • before (), type 를 판단 할 수 있 습 니 다.info 대상 의 순서 가 다른 이전 인지 여부 (관련, 같은 프로그램 에서 여러 번 호출 해도 다 를 수 있 습 니 다. 어떤 실제 역할 을 하 는 지 잘 이해 하지 못 합 니 다)
  • = = 와! =연산 자, 두 type 판단info 가 같 거나 같 지 않 음
  • typeid 연산 자
    typeid 조작 자 는 에서 설명 합 니 다. 실행 할 때 유형, 변수, 표현 식 의 유형 정 보 를 가 져 오 는 데 사 용 됩 니 다. C + 기본 유형, 내장 류, 사용자 정의 류, 템 플 릿 류 등에 적 용 됩 니 다.
    그것 은 두 가지 형식 이 있다.
  • typeid (유형)
  • typeid (표현 식)
  • 구체 적 인 용법 앞의 예제 코드 가 이미 있 습 니 다.
    type_index
    type_index 클래스 는 헤더 파일 에서 type 이 라 고 설명 합 니 다.info 대상 의 패키지 클래스 는 관련 용기 (예 를 들 어 map) 와 무질서 한 관련 용기 (예 를 들 어 unordered map) 의 색인 으로 사용 할 수 있 습 니 다.
    다음 코드http://en.cppreference.com/w/cpp/types/type_index) type 사용index 에서 일부 유형의 정 보 를 출력 합 니 다. (디 버 깅 은 꽤 유용 합 니 다.)
    struct A {
        virtual ~A() {}
    };
    
    struct B : A {};
    struct C : A {};
    
    int main()
    {
        std::unordered_map<std::type_index, std::string> type_names;
    
        type_names[std::type_index(typeid(int))] = "int";
        type_names[std::type_index(typeid(double))] = "double";
        type_names[std::type_index(typeid(A))] = "A";
        type_names[std::type_index(typeid(B))] = "B";
        type_names[std::type_index(typeid(C))] = "C";
    
        int i;
        double d;
        A a;
    
        // note that we're storing pointer to type A
        std::unique_ptrb(new B);
    std::unique_ptrc(new C);
    std::cout << "i is " << type_names[std::type_index(typeid(i))] << '';
    std::cout << "d is " << type_names[std::type_index(typeid(d))] << '';
    std::cout << "a is " << type_names[std::type_index(typeid(a))] << '';
    std::cout << "b is " << type_names[std::type_index(typeid(*b))] << '';
    std::cout << "c is " << type_names[std::type_index(typeid(*c))] << '';
    }

    좋은 웹페이지 즐겨찾기