본문 바로가기
  • 쓸쓸한 개발자의 공부방
C++

[C++] RTTI (Run Time Type Information)

by 심찬 2021. 12. 29.

 

 

RTTI(Run Time Type Information)

실행시간에 타입의 정보를 얻을 때 사용하는 기술

<typeinfo> 헤더 포함하고 typeid 연산자를 사용하면 된다.

타입의 정보를 담은 type_info 객체를 얻을 수 있다.

type_info 객체의 멤버 함수 name()을 사용해 출력 가능하다.

#include <iostream>
#include <typeinfo>

int main()
{
    int  n1 = 10;
    auto n2 = n1; // n2의 타입은 int ?
    
    const std::type_info& t1 = typeid(n2);
    
    std::cout << t1.name() << std::endl;
}

int 형을 기라키는 i 가 출력된다.

#include <iostream>
#include <typeinfo>

int main()
{
    
    std::type_info t2; // error
    // 사용자가 직접 객체를 만들 수 없음, typeid()연산자를 통해서만 얻을 수 있다.
    auto n1 = 10;
    
    typeid(n1);
    typeid(int);
    const std::type_info& t = typeid(3 + 4.2);
    
    std::cout << t.name() << std::endl;
}

 

type_info 객체를 만들 수 없기 때문에 아래와 같이 에러가 출력된다.

main.cpp:7:20: error: no matching function for call to ‘std::type_info::type_info()’
    7 |     std::type_info t2; // error
      |                    ^~
In file included from /usr/include/c++/9/bits/exception_ptr.h:39,
                 from /usr/include/c++/9/exception:143,
                 from /usr/include/c++/9/ios:39,
                 from /usr/include/c++/9/ostream:38,
                 from /usr/include/c++/9/iostream:39,
                 from main.cpp:1:
/usr/include/c++/9/typeinfo:178:5: note: candidate: ‘std::type_info::type_info(const std::type_info&)’
  178 |     type_info(const type_info&);
      |     ^~~~~~~~~
/usr/include/c++/9/typeinfo:178:5: note:   candidate expects 1 argument, 0 provided
/usr/include/c++/9/typeinfo:173:14: note: candidate: ‘std::type_info::type_info(const char*)’
  173 |     explicit type_info(const char *__n): __name(__n) { }
      |              ^~~~~~~~~
/usr/include/c++/9/typeinfo:173:14: note:   candidate expects 1 argument, 0 provided

 

RTTI 타입 비교

 

타입을 출력하는 것이 아니라 조사하고 싶을 때

2개의 type_info 객체를 == 연산자로 비교할 수 있다.

typeid 의 결과를 비교해도 된다.

 

#include <iostream>
#include <typeinfo>

int main()
{
    auto n1 = 10;
    
    const std::type_info& t1 = typeid(n1);
    const std::type_info& t2 = typeid(int);
    
    if ( t1 == t2 )
    {
        std::cout << "same" << std::endl;
    }
    
    if ( t1.hash_code() == t2.hash_code() )
    {
        std::cout << "same" << std::endl;
    }
    
    std::cout << t1.name() << std::endl;
}

RTTI 의 다양한 예시

 

int, float, double, vector, array는 어떤 name()으로 출력되는지 확인해본다.

#include <iostream>
#include <typeinfo>
#include <vector>
#include <array>
using namespace std;

int main()
{
    auto n1 = 10;
    const std::type_info& t = typeid(n1);
    cout << t.name() << endl;
    
    cout << typeid(int).name() << endl;
    cout << typeid(3 + 4.2).name() << endl;
    
    float value = 3+4.2;
    cout << typeid(value).name() << endl;
    
    vector<int> v;
    v.push_back(1);
    cout << typeid(v).name() << endl;
    cout << typeid(v.at(0)).name() << endl;
    
    vector<double> v1;
    v1.push_back(1);
    cout << typeid(v1).name() << endl;
    cout << typeid(v1.at(0)).name() << endl;
    
    array<double, 2> aa = {1,2};
    cout << typeid(aa).name() << endl;
    cout << typeid(aa[0]).name() << endl;
    
    array<int, 3> bb = {1,2,3};
    cout << typeid(bb).name() << endl;
    cout << typeid(bb[0]).name() << endl;
}

 

출력 결과에서 보면 vector, array 의 경우는 다른 형태로 출력됨을 알 수 있다.

vector와 array 내부 타입 정보도 출력됨을 알 수 있다.

 

댓글