On this page
article
C++ Type Identity
목적
function template
의 타입 추론을 막고 명확하게 타입을 작성하도록 하기 위해 type_identity
를 사용한다.
type_identity
는 클래스이므로 타입 추론이 불가능하다.- 타입을 명시하지 않으면 에러가 발생하도록 유도할 수 있다.
- C++20 이전까지는 직접 구현해야 했지만, C++20부터는 표준 라이브러리에 포함되었다.
#include <iostream>
// C++20 이전 버전에서의 type_identity 구현
template<typename T>
struct type_identity {
using type = T;
};
// 함수 템플릿 예제
// 일반 템플릿: 타입 추론 가능
template<typename T>
void f1(T arg) {}
// type_identity 사용: 타입 추론 불가
template<typename T>
void f2(typename std::type_identity<T>::type arg) {}
int main() {
f1<int>(3); // OK: 명시적 타입 지정
f1(3); // OK: 타입 추론
f2<int>(3); // OK: 명시적 타입 지정
// f2(3); // Error: 타입 추론 불가
type_identity<int>::type n; // int n;
}
주의사항
인자가 2개 이상일 때는 타입이 추론될 수 있다.
#include <iostream>
// 타입 추론 방지 함수
template<typename T>
void f1(typename std::type_identity<T>::type arg) {}
// 두 번째 인자만 타입 추론 방지
template<typename T>
void f2(T arg1, typename std::type_identity<T>::type arg2) {}
// 두 인자 모두 타입 추론
template<typename T>
void f3(T arg1, T arg2) {}
int main() {
// f1(3); // Error: 타입 추론 불가
f1<int>(3); // OK
f2(3, 4); // OK: T = int로 추론
f3(1, 2); // OK: T = int
// f3(1, 2.2); // Error: 타입 불일치
f2(1, 2.2); // OK: arg1 = int, arg2 = int로 추론됨
}
요약
- type_identity는 함수 템플릿의 타입 추론을 막기 위해 사용한다.
- C++20부터 표준 제공 (
std::type_identity
) - 인자가 여러 개일 경우 일부 타입이 추론될 수 있음
함수 | 타입 추론 가능 여부 | 사용 예시 |
---|---|---|
f1 | O | f1(3); |
f2 | X (type_identity 사용) | f2<int>(3); |
f2 (2개 인자) | 일부 추론 가능 | f2(3, 4); |
f3 | O (둘 다 추론) | f3(1, 2); |