17. C++ decltype, typeid

C++ decltype, typeid

1. 개요

1.1 문서 개요

이 문서는 C++에서 타입 추론과 런타임 타입 정보(RTTI)에 관련된 두 가지 주요 키워드인 decltypetypeid에 대해 설명합니다. decltype은 컴파일 타임에 표현식의 타입을 추론하는 데 사용되며, typeid는 런타임 시 객체의 실제 타입 정보를 제공합니다. 이 두 기능은 C++의 정적 및 동적 타입 시스템을 활용하여 코드의 유연성과 안정성을 높이는 데 기여합니다.

2. 내용

2.1 decltype 키워드

decltype은 표현식의 타입을 추론하여 변수 선언 시 명시적인 타입 지정 없이도 정확한 타입을 지정할 수 있도록 합니다. 이는 특히 템플릿 프로그래밍이나 복잡한 타입이 관련된 상황에서 유용하게 사용됩니다.

2.1.1 기본 사용법

decltype(expr)expr의 타입을 반환합니다. 단, expr은 평가되지 않으며, 오직 타입만 확인합니다.

int x = 5;
decltype(x) y = 10; // y는 int 타입
int a = 0;
const int& r = a;
decltype(r) s = a; // s는 const int& 타입

2.1.2 함수 리턴 타입 추론

decltype은 함수의 반환 타입을 복잡한 표현식 기반으로 지정할 때 사용됩니다.

template <typename T1, typename T2>
auto add(T1 a, T2 b) -> decltype(a + b) {
    return a + b;
}

2.1.3 괄호 유무에 따른 차이

decltype(x)decltype((x))는 다른 결과를 반환할 수 있습니다.

int x = 5;
decltype(x) a;     // int
decltype((x)) b = x; // int& (참조)

2.2 typeid 연산자

typeid는 런타임 시 객체의 실제 타입 정보를 std::type_info 객체로 반환합니다. 이 기능은 다형성(polymorphism)이 적용된 상황에서 객체의 실제 타입을 확인하는 데 사용됩니다.

2.2.1 기본 사용법

#include <iostream>
#include <typeinfo>

int main() {
    int a = 42;
    std::cout << typeid(a).name() << std::endl; // int의 컴파일러 종속적 이름 출력
}

2.2.2 다형성과 typeid

typeid는 기본적으로 포인터나 참조를 통해 전달된 객체가 다형적인 경우, 가상 함수 테이블을 통해 실제 타입을 추론합니다.

class Base {
public:
    virtual ~Base() {}
};

class Derived : public Base {};

Base* ptr = new Derived();
std::cout << typeid(*ptr).name() << std::endl; // Derived로 평가됨

단, Base 클래스에 가상 함수가 없다면 typeid(*ptr)Base로 평가됩니다.

2.2.3 typeid와 std::type_info

typeid의 결과는 const std::type_info& 객체입니다. name(), before(), hash_code() 등의 멤버 함수들을 제공합니다.

함수 설명
.name() 타입 이름을 반환 (컴파일러 종속)
.before() 타입 비교 (정렬용)
.hash_code() 타입에 대한 해시값 반환

2.2.4 typeid와 예외 처리

런타임 객체의 참조에 대해 typeid를 사용할 때, 참조가 nullptr이면 std::bad_typeid 예외가 발생할 수 있습니다.

Base* ptr = nullptr;
try {
    std::cout << typeid(*ptr).name() << std::endl;
} catch (const std::bad_typeid& e) {
    std::cout << "bad_typeid exception: " << e.what() << std::endl;
}

3. 마무리

이 문서에서는 C++에서 타입을 다루는 주요 도구인 decltypetypeid에 대해 정리하였습니다. decltype은 컴파일 타임의 타입 추론 도구로, 특히 템플릿 기반 프로그래밍에서 효과적이며, typeid는 런타임 시 객체의 실제 타입 정보를 확인하는 데 사용됩니다. 정적 타입 시스템과 런타임 타입 정보는 서로 다른 상황에서의 타입 안전성과 유연성을 제공하며, 이 두 기능은 C++의 고급 프로그래밍 기술에서 중요한 구성 요소로 작용합니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!
위로 스크롤