C++11 - type_info와 type_index

C++에서는 RTTI(Run Time Type Infomation/Identification)라고 불리는 기능이 있다.
( 타 언어의 리플렉션과 좀 비슷한데 기능은 훨씬 떨어짐 ^^;)
std::type_info는 타입 정보를 표현하는 클래스이다. type_info 객체는 typeid 식에서 얻을 수 있다.
typeid 식은 오퍼랜드 식 혹은 type-id를 취한다.
typeid 식의 결과는 const한 std::type_info 타입 lvalue 이다.
typeid 식은 실행 시 타입 정보를 얻는다(컴파일 타임이 아니다!!!)


사용 방법

typeid 식을 사용하려면 typeinfo 헤더를 include 할 필요가 있다.

#include <typeinfo>


예제 1

#include <iostream>       
#include <typeinfo>

int main()
{
    std::type_info const *ptr;
    {
        ptr = &typeid(int);
    }

    std::cout << ptr->name() << std::endl;
}



예제 2

// http://www.cplusplus.com/reference/typeinfo/type_info/name/
// type_info::name example
#include <iostream>       // std::cout
#include <typeinfo>       // operator typeid

int main() {
  int i;
  int * pi;
  std::cout << "int is: " << typeid(int).name() << '\n';
  std::cout << "  i is: " << typeid(i).name() << '\n';
  std::cout << " pi is: " << typeid(pi).name() << '\n';
  std::cout << "*pi is: " << typeid(*pi).name() << '\n';

  return 0;
}

결과

int is: int
  i is: int
 pi is: int *
*pi is: int



예제 3

typeid는 비교 연산을 할 수 있다.

typeid(int) == typeid(double) ; 



예제 4

#include <iostream>       
#include <typeinfo>

struct Base { virtual void p() {} };
struct Cat : Base { } ;
struct Dog : Base { } ;

std::string get_name( Base & ref )
{
    decltype(auto) ti = typeid(ref) ;
    if ( ti == typeid(Cat) )
        return "고양이" ;
    else if ( ti == typeid(Dog) )
        return "개" ;

    return "모름" ;
}

int main()
{
    Base base;
    std::cout << get_name(base) << std::endl;
    
    Cat cat;
    std::cout << get_name(cat) << std::endl;
    
    Dog dog;
    std::cout << get_name(dog) << std::endl;
    
    return 0;
}

Base 클래스는 꼭 가상함수를 가지고 있어야 get_name 함수가 올바르게 동작한다.



예제 4

#include <iostream>
#include <map>
#include <typeindex>

int main()
{
    std::map< std::type_index, std::string > m =
    {
        { typeid(int), "int" },
        { typeid(double), "double"}
    } ;

    std::cout << m[typeid(int)] << '\n' ;
}



참고

  • https://cpplover.blogspot.kr/2014/10/ctypeidtypeinfotypeindex.html
  • http://www.cplusplus.com/reference/typeinfo/type_info/

이 글은 2017-03-23에 작성되었습니다.