template_parameters — 템플릿 매개변수와 템플릿 인자

template_parameters — 템플릿 매개변수와 템플릿 인자 (Template parameters and template arguments)

**템플릿 매개변수(template parameter)**는 템플릿 선언의 parameter-list에 표시된, 템플릿을 매개변수화하는 요소예요. **템플릿 인자(template argument)**는 템플릿에 실제로 전달되는 값이에요.

출처: cppreference

본문

템플릿 매개변수

모든 템플릿은 하나 이상의 템플릿 매개변수로 매개변수화돼요.

template< parameter-list > declaration         // (1)
template< parameter-list > requires constraint declaration  // (2)

parameter-list의 각 매개변수는 다음 중 하나일 수 있어요.

  • 비타입(non-type / constant) 템플릿 매개변수 — 값 (예: int N)
  • 타입(type) 템플릿 매개변수 — 타입 (예: typename T)
  • 템플릿(template) 템플릿 매개변수 — 템플릿 (예: template<class> class C)
template<typename T, int N>        // T: 타입, N: 비타입 (값)
struct Array {
    T data[N];
};

template<template<class> class Container>   // 템플릿 템플릿 매개변수
struct Example {
    Container<int> c;
};

템플릿 인자

템플릿을 사용할 때 각 매개변수에 템플릿 인자를 제공해요.

  • 타입 매개변수에는 타입 인자 (Array<int, 5>)
  • 비타입 매개변수에는 상수 값 인자
  • 템플릿 매개변수에는 템플릿 인자
Array<double, 3> vec;      // T=double, N=3
Array<int, 10> buf;        // T=int, N=10

비타입 템플릿 매개변수

비타입(상수) 템플릿 매개변수는 컴파일 타임에 알 수 있는 값이어야 해요.

template<int N>
int factorial() { return N == 0 ? 1 : N * factorial<N-1>(); }

constexpr int SIZE = 100;
Array<int, SIZE> big;     // constexpr 값 사용

비타입 템플릿 매개변수로는 정수, 포인터, 참조, std::nullptr_t, C++20부터 리터럴 클래스 타입(literal class)의 값 등을 쓸 수 있어요.

기본 템플릿 인자

템플릿 매개변수는 기본값을 가질 수 있어요.

template<typename T = int, int N = 10>
struct Box { T data[N]; };

Box<> b;        // Box<int, 10>
Box<float> c;   // Box<float, 10>

템플릿 매개변수와 인자를 정확히 이해하는 것은 제네릭 프로그래밍과 템플릿 메타프로그래밍의 기초예요. 타입·값·템플릿이라는 세 종류의 매개변수를 구분하는 것이 핵심이에요.

더 알아보기 (Learn more)

cppreference