typeid 연산자

구문

typeid(type-id)
typeid(expression)

설명

typeid 연산자를 사용하면 런타임에 개체 형식이 결정됩니다.

typeid의 결과는 const type_info&입니다. 사용하는 typeid 형식에 따라 type-id 또는 expression의 형식을 나타내는 type_info 개체에 대한 참조가 값입니다. 자세한 내용은 type_info 클래스를 참조하세요.

typeid 연산자는 관리되는 형식(추상 선언자 또는 인스턴스)에서 작동하지 않습니다. 지정된 형식의 Type을(를) 가져오는 방법에 대한 자세한 내용은 typeid를 참조하세요.

typeid 연산자는 다형 클래스 형식의 l-value에 적용될 때 런타임 검사를 하지 않습니다. 제공된 정적 정보로 개체의 true 형식을 확인할 수 없습니다. 다음과 같은 경우가 여기에 해당합니다.

  • 클래스에 대한 참조

  • *으(로) 역참조되는 포인터

  • 아래 첨자 포인터([ ])입니다. (다형 형식의 포인터에 첨자를 사용하는 것은 안전하지 않습니다.)

expression이 기본 클래스를 가리지만 개체 형식이 실제로 기본 클래스에서 파생된 경우 결과는 파생된 클래스의 type_info 참조입니다. expression은 다형 형식(가상 함수가 있는 클래스)을 가리켜야 합니다. 그렇지 않으면 결과는 expression에서 참조되는 정적 클래스의 type_info입니다. 또한 포인터가 가리키는 객체가 사용된 객체가 되도록 포인터를 역참조해야 합니다. 포인터를 역참조하지 않으면 포인터가 가리키는 것이 아니라 포인터의 결과는 type_info이(가) 됩니다. 예시:

// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo>

class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
int main() {
   Derived* pd = new Derived;
   Base* pb = pd;
   cout << typeid( pb ).name() << endl;   //prints "class Base *"
   cout << typeid( *pb ).name() << endl;   //prints "class Derived"
   cout << typeid( pd ).name() << endl;   //prints "class Derived *"
   cout << typeid( *pd ).name() << endl;   //prints "class Derived"
   delete pd;
}

expression이 포인터를 역참조하고 포인터의 값이 0이면 typeid이(가) bad_typeid exception을 throw합니다. 포인터가 유효한 개체를 가리키지 않으면 __non_rtti_object 예외가 throw됩니다. 개체가 어떻게든 유효하지 않으므로 오류를 트리거한 RTTI를 분석하려는 시도를 나타냅니다. (예를 들어 잘못된 포인터이거나 코드가 /GR을 사용하여 컴파일되지 않았습니다).

expression이 개체의 기본 클래스에 대한 포인터도 아니고 참조도 아닐 경우 expression의 정적 형식을 나타내는 type_info 참조가 결과입니다. 식의 정적 형식은 컴파일 타임에 알려지는 식의 형식을 참조합니다. 식의 정적 형식을 평가할 때 식의 의미 체계가 무시됩니다. 또한 식의 정적 형식을 결정할 때 가능할 경우 참조가 무시됩니다.

// expre_typeid_Operator_2.cpp
#include <typeinfo>

int main()
{
   typeid(int) == typeid(int&); // evaluates to true
}

typeid을(를) 템플릿에 사용하여 템플릿 매개 변수의 형식을 확인할 수도 있습니다.

// expre_typeid_Operator_3.cpp
// compile with: /c
#include <typeinfo>
template < typename T >
T max( T arg1, T arg2 ) {
   cout << typeid( T ).name() << "s compared." << endl;
   return ( arg1 > arg2 ? arg1 : arg2 );
}

참고 항목

런타임 형식 정보
키워드