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