필요헤더 : 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타입이네요.
댓글 없음:
댓글 쓰기