C++ decltype, typeid
1. 개요
1.1 문서 개요
이 문서는 C++에서 타입 추론과 런타임 타입 정보(RTTI)에 관련된 두 가지 주요 키워드인 decltype
과 typeid
에 대해 설명합니다. 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++에서 타입을 다루는 주요 도구인 decltype
과 typeid
에 대해 정리하였습니다. decltype
은 컴파일 타임의 타입 추론 도구로, 특히 템플릿 기반 프로그래밍에서 효과적이며, typeid
는 런타임 시 객체의 실제 타입 정보를 확인하는 데 사용됩니다. 정적 타입 시스템과 런타임 타입 정보는 서로 다른 상황에서의 타입 안전성과 유연성을 제공하며, 이 두 기능은 C++의 고급 프로그래밍 기술에서 중요한 구성 요소로 작용합니다.