목적

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)
  • 인자가 여러 개일 경우 일부 타입이 추론될 수 있음

함수타입 추론 가능 여부사용 예시
f1Of1(3);
f2X (type_identity 사용)f2<int>(3);
f2 (2개 인자)일부 추론 가능f2(3, 4);
f3O (둘 다 추론)f3(1, 2);