C++ 템플릿(Templates)은 컴파일 시 다양한 타입에 대해 코드를 자동 생성하는 메커니즘이다. 제네릭 프로그래밍과 메타프로그래밍의 기반이다.
함수 템플릿
cpp
template<typename T>
T max(T a, T b) {
return a > b ? a : b;
}
max(3, 5); // int 버전 생성
max(3.14, 2.71); // double 버전 생성
max('a', 'z'); // char 버전 생성
클래스 템플릿
cpp
template<typename T, size_t N>
class FixedArray {
T data[N];
public:
T& operator[](size_t i) { return data[i]; }
constexpr size_t size() const { return N; }
T* begin() { return data; }
T* end() { return data + N; }
};
FixedArray<int, 5> arr;
arr[0] = 42;
템플릿 특수화
cpp
// 일반 템플릿
template<typename T>
struct TypeInfo { static const char* name() { return "unknown"; } };
// 전체 특수화
template<>
struct TypeInfo<int> { static const char* name() { return "int"; } };
// 부분 특수화 (포인터)
template<typename T>
struct TypeInfo<T*> { static const char* name() { return "pointer"; } };
가변 인자 템플릿 (C++11)
cpp
// 재귀 전개
template<typename T>
void print(T val) { std::cout << val << "
"; }
template<typename T, typename... Rest>
void print(T first, Rest... rest) {
std::cout << first << " ";
print(rest...);
}
print(1, "hello", 3.14, true);
// 1 hello 3.14 1
SFINAE와 개념(Concepts, C++20)
cpp
// C++20 Concepts
template<typename T>
concept Numeric = std::integral<T> || std::floating_point<T>;
template<Numeric T>
T add(T a, T b) { return a + b; }
add(1, 2); // OK
add(1.0, 2.0); // OK
// add("a", "b"); // 컴파일 에러: 명확한 메시지
관련 개념