language_typeid

language_typeid (typeid 연산자)

타입에 대한 정보를 질의해요. 다형적 객체의 동적 타입을 알아야 할 때와 정적 타입 식별에 사용돼요. std::type_info 객체를 돌려줘요.

출처: cppreference

본문

문법

typeid ( type )        // (1)
typeid ( expression )  // (2)

typeid 표현식은 정적 저장 기간을 가진 객체를 참조하는 lvalue 표현식이에요. 그 객체는 다형적 타입 std::type_info 또는 그에서 파생된 타입의 const-한정 버전이에요.

typeid를 쓸 때 표준 라이브러리의 std::type_info 정의가 보이지 않으면 프로그램은 ill-formed예요.

설명

type이나 expression의 타입이 클래스 타입이거나 클래스 타입에 대한 참조라면, 그 클래스 타입은 불완전 타입일 수 없어요.

    1. type을 나타내는 std::type_info 객체를 참조해요. type이 참조 타입이면 결과는 참조된 타입의 cv-unqualified 버전을 나타내는 std::type_info 객체를 참조해요.
    1. expression을 검사해요.
    • expression이 다형적 타입(가상 함수를 하나 이상 선언하거나 상속받는 클래스)의 객체를 식별하는 glvalue 표현식이면, 실행 시간에 실제 동적 타입을 결정해 그에 해당하는 std::type_info 객체를 참조해요.
    • 그 외의 경우, expression의 정적 타입을 기준으로 std::type_info 객체를 참조해요.

typeid 표현식은 전체 표현식(full-expression)의 끝에서 파괴되지 않는 임시 std::type_info 객체에 대한 lvalue를 산출해요.

#include <typeinfo>

struct Base { virtual ~Base() {} };
struct Derived : Base {};

Base* pb = new Derived;
typeid(*pb) == typeid(Derived);  // true: 실행 시간 동적 타입
typeid(pb) == typeid(Base*);     // true: 포인터의 정적 타입

다형적 객체의 참조·포인터에 typeid를 쓰면 실행 시간에 실제 파생 타입을 알 수 있고, 그 외에는 정적 타입을 반환해요.

더 알아보기 (Learn more)

cppreference