template_argument_deduction — 템플릿 인자 추론

template_argument_deduction — 템플릿 인자 추론 (Template argument deduction)

**템플릿 인자 추론(template argument deduction)**은 함수 템플릿을 인스턴스화하기 위해, 빠진 템플릿 인자를 함수 인자로부터 추론하는 과정이에요.

함수 템플릿을 인스턴스화하려면 모든 템플릿 인자를 알아야 하지만, 모든 인자를 지정할 필요는 없어요. 가능하면 컴파일러가 함수 인자로부터 빠진 템플릿 인자를 추론해요.

출처: cppreference

본문

템플릿 인자 추론은 함수 템플릿을 호출하려 할 때, 함수 템플릿의 주소를 취할 때, 그리고 일부 다른 문맥에서 발생해요.

#include <iostream>

int main()
{
    std::cout << "Hello, world" << std::endl;
    // operator<< 는 ADL로 std::operator<< 를 조회한 뒤
    // 두 번 모두 operator<<<char, std::char_traits<char>> 로 추론됨
    // std::endl 은 &std::endl<char, std::char_traits<char>> 로 추론됨
}

템플릿 인자 추론은 함수 템플릿 이름 조회 후, 그리고 템플릿 인자 치환(substitution) 전에 일어나요.

template<typename T>
T max(T a, T b) { return (a > b) ? a : b; }

max(1, 2);       // T = int 추론
max(1.5, 2.5);   // T = double 추론
max('a', 'z');   // T = char 추론

추론은 매개변수 타입과 인자 타입의 "패턴 매칭"으로 이뤄져요.

template<typename T>
void f(const T& x);      // T 는 const & 를 제거하고 추론
f(10);                   // T = int

template<typename T>
void g(T* p);            // 포인터
int v;
g(&v);                   // T = int

template<typename T, std::size_t N>
void h(T (&arr)[N]);     // 배열 크기도 추론
int a[5];
h(a);                    // T = int, N = 5

주의할 점들:

  • 두 매개변수가 같은 템플릿 매개변수를 쓰면 인자들이 일치해야 해요.
    // max(1, 2.5) 는 T 를 동시에 int 와 double 로 추론하려 해서 실패
    
  • std::move, std::forward 처럼 참조 축약이 필요한 경우가 있어요.
  • 추론에 실패하거나 모순이 생기면 해당 오버로드는 후보에서 제외돼요 (SFINAE).

템플릿 인자 추론은 함수 템플릿이 타입을 명시하지 않고도 동작하게 하는 핵심 메커니즘이에요. 표준 라이브러리의 대부분 알고리즘과 클래스 템플릿 인자 추론(CTAD)이 이를 활용해요.

더 알아보기 (Learn more)

cppreference