function_template — 함수 템플릿

function_template — 함수 템플릿

**함수 템플릿(function template)**은 타입을 매개변수로 받아, 다양한 타입에 대해 같은 로직을 적용하는 함수 패턴이에요.

타입마다 함수를 반복 작성하지 않고, 타입을 추상화한 함수를 하나 써서 컴파일러가 호출 시점에 타입별로 인스턴스화해요. 제네릭 프로그래밍의 핵심 도구예요.

출처: cppreference

본문

함수 템플릿은 타입 매개변수(또는 비타입 매개변수)로 매개변수화된 함수 패턴이에요.

문법 (Syntax)

template < parameter-list > function-declaration

기본 사용

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

max_of(3, 5);        // T = int
max_of(3.5, 2.1);    // T = double
max_of(std::string("a"), std::string("b"));

호출 인자의 타입으로부터 T가 추론돼요 (템플릿 인자 추론).

여러 타입 매개변수

template <typename T, typename U>
std::pair<T, U> make_pair_val(T a, U b) {
    return {a, b};
}

비타입 매개변수

template <typename T, int N>
T multiply(T x) { return x * N; }
multiply<int, 3>(5);   // 15

명시적 템플릿 인자

추론이 안 되거나 명시하고 싶으면 명시해요.

template <typename T>
T cast_to(int x) { return static_cast<T>(x); }
auto d = cast_to<double>(3);   // T = double 명시

오버로딩

함수 템플릿과 비템플릿 함수는 오버로드될 수 있어요. 비템플릿이 더 구체적이면 우선 선택돼요.

int foo(int) { return 1; }              // 비템플릿
template <typename T> T foo(T) { return 0; }  // 템플릿

foo(5);      // 비템플릿 foo(int) 선택
foo(5.0);    // 템플릿 foo(double) 선택

특수화

특정 타입에 대해 별도 동작을 정의할 수 있어요.

template <typename T> T f(T x) { return x; }
template <> const char* f(const char* s) { return "special"; }  // 명시적 특수화

함수 템플릿 인자 추론 규칙

  • 값 매개변수는 const/reference/배열이 붕괴돼요.
  • 참조 매개변수(const T&)는 붕괴 없이 정확한 타입 추론.
  • auto 매개변수(축약 함수 템플릿, C++20)도 있어요.

노트 (Notes)

  • 정의는 헤더에 두는 게 일반적이에요 (인스턴스화가 정의를 필요).
  • two-phase name lookup이라는 특수한 조회 규칙이 있어요.
  • C++20의 개념(concept)은 템플릿 매개변수에 제약을 걸 수 있어요.

더 알아보기 (Learn more)

cppreference