최상단 광고

2012년 4월 8일 일요일

typeid, type_info


typeid, type_info 


필요헤더 : typeinfo.h 또는 typeinfo( std 이름공간 사용, 밑에서는 생략 )

두 타입이 같거나 같지 않음을 비교, 또는 타입을 문자열로 바꿔줄 때 typeid와 type_info를 사용할 수 있다.

이 두 녀석은 '실행시간' 에 행해진다.

먼저 두 타입을 비교하기 위해서는 typeid( 타입 ) 을 사용한다. typeid 는 지정한 타입에 특정지어지는 type_info 의

참조값을 반환한다. type_info 는 ==, != 연산자를 가지고 있어서 이 연산자를 통해 비교할 수 있다. 즉,

if( typeid( int ) != typeid( char ) )
    printf( "같지 않은데요.\n" );

위와 같이 사용할 수 있다.

만약 type_info 의 참조값을 어디엔가 유지하고 싶다면 다음을 주의하자. 타입에 대한 참조값은 항상 일정한 것은 아니다. 이것은

&typeid( int ) == &typeid( int ) 가 항상 성립한다고 볼 수 없다는 것이다. 참조값을 유지한다면 참조에 대한 포인터를 유지하고

비교시 포인터의 값을 비교해야 된다.

예 :
    const type_info *int_type = &typeid( int );
    const type_info *char_type = &typeid( char );

    if( *int_type != *char_type )
        printf( "같지 않은데요.\n" );


다음으로 타입에 대한 문자열을 얻는 방법인데, 이것은 type_info 객체를 이용하는 것이다.

type_info 클래스는 생성자와 복사대입연산자가 private 로 설정되어 있어서 객체를 직접 생성하는 것은 불가능하고

typeid 로부터 얻어내야 한다. type_info 멤버함수에는 name() 함수가 있는데 이것은 자료형에 대한 const char* 타입의 문자열을

반환해준다. 즉,

printf( "이 타입은 %s타입이네요.\n", typeid( int ).name() );

과 같이 작성할 수 있다. 하지만 타입에 대한 문자열 변환은 표준에 없는 내용이어서 그 결과를 예측하기는 어렵다.

VC++6.0 에서는 다음과 같은 형태로 출력해준다.

class A
{
...
};

printf( "이 타입은 %s타입이네요.\n", typeid( A ).name() );

결과 : 이 타입은 class A타입이네요.

댓글 없음: