다음을 통해 공유


typeid 연산자

typeid( type-id )
typeid( expression )

설명

typeid 연산자를 실행된 시간에 결정 하는 개체의 형식이 있습니다.

결과는 typeid 되는 consttype_info &. 값에 대 한 참조입니다를 type_info 나타내는 개체는 형식 id 의 형식이 나는 어떤 형식에 따라 typeid 사용 됩니다.참조 하십시오 type_info 클래스 에 대 한 자세한 내용은.

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

typeid 연산자 하지 다형 클래스 형식에는 l-값에 적용 될 때 런타임 검사는 true 형식 개체의 정적 정보로 확인할 수 없습니다.이러한 경우는 다음과 같습니다.

  • 클래스에 대 한 참조

  • 포인터를 역참조를 *

  • 아래 첨자 포인터 (예:[ ]).(일반적으로 아래 첨자 다형 형식에 대 한 포인터를 사용 하 여 수신 되지 않도록 참고.)

경우는 포인트는 기본 클래스 형식으로 해당 기본 클래스에서 파생 된 형식의 개체를 실제로입니다 아직는 type_info 결과 파생된 클래스에 대 한 참조입니다.해당 다형 형식 (가상 함수를 포함 하는 클래스)를 가리켜야 합니다.그렇지 않으면 결과입니다의 type_info 를 참조 하는 정적 클래스에는 .또한,가 가리키는 개체를 사용 하는 포인터를 역참조 해야 합니다.결과 포인터를 역참조 하지 않고 수는 type_info 없습니다 어떤 it에 대 한 포인터를 가리키는.예를 들면 다음과 같습니다.

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

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;
}

경우는 대 한 포인터를 역참조와 포인터의 값이 0 인지 typeid throw는 bad_typeid 예외.포인터가 잘못 된 개체를 가리키지 않는 경우는 __non_rtti_object 예외가 발생 하면 오류를 트리거한 RTTI 분석 하려는 시도 나타내는 (액세스 위반 같은) 개체가 어떤 식으로든 잘못 되어 (잘못 된 포인터 또는 코드가 없습니다 사용 하 여 컴파일한 /GR).

경우는 도 아니고 포인터는 개체의 기본 클래스에 대 한 참조입니다 결과입니다의 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 );
}

참고 항목

참조

런타임 형식 정보

C + + 키워드