비타입 템플릿 매개변수
2025. 3. 28. 08:47ㆍProgramming Languages/C++
7.3 비타입 템플릿 매개변수
템플릿 매개변수는 타입뿐만 아니라 상수 값도 될 수 있습니다:
#include <iostream>
#include <array>
// 비타입 템플릿 매개변수를 사용한 고정 크기 배열
template <typename T, size_t Size>
class FixedArray {
private:
T data[Size];
public:
// 기본 생성자
FixedArray() {
for (size_t i = 0; i < Size; i++) {
data[i] = T();
}
}
// 초기화 목록을 받는 생성자 (C++11)
FixedArray(std::initializer_list<T> init) {
size_t i = 0;
for (const T& val : init) {
if (i < Size) {
data[i++] = val;
} else {
break;
}
}
// 나머지 요소 기본값으로 초기화
for (; i < Size; i++) {
data[i] = T();
}
}
// 요소 접근
T& operator[](size_t index) {
if (index >= Size) {
throw std::out_of_range("인덱스가 범위를 벗어났습니다.");
}
return data[index];
}
const T& operator[](size_t index) const {
if (index >= Size) {
throw std::out_of_range("인덱스가 범위를 벗어났습니다.");
}
return data[index];
}
// 배열 크기 반환
constexpr size_t size() const {
return Size;
}
// 배열 내용 출력
void print() const {
std::cout << "[ ";
for (size_t i = 0; i < Size; i++) {
std::cout << data[i];
if (i < Size - 1) {
std::cout << ", ";
}
}
std::cout << " ]" << std::endl;
}
};
// 비타입 템플릿 매개변수를 사용한 2D 포인트
template <int X, int Y>
struct Point {
static constexpr int x = X;
static constexpr int y = Y;
void print() const {
std::cout << "Point(" << x << ", " << y << ")" << std::endl;
}
// 두 점 사이의 맨해튼 거리 계산
template <int X2, int Y2>
static constexpr int manhattanDistance(const Point<X2, Y2>&) {
return std::abs(X - X2) + std::abs(Y - Y2);
}
};
int main() {
// 고정 크기 배열 사용
FixedArray<int, 5> intArray = {10, 20, 30, 40, 50};
std::cout << "intArray 내용:" << std::endl;
intArray.print();
std::cout << "intArray[2] = " << intArray[2] << std::endl;
// 크기가 다른 배열
FixedArray<double, 3> doubleArray = {1.1, 2.2, 3.3};
std::cout << "doubleArray 내용:" << std::endl;
doubleArray.print();
// 초기화 목록보다 더 큰 배열
FixedArray<char, 10> charArray = {'H', 'e', 'l', 'l', 'o'};
std::cout << "charArray 내용:" << std::endl;
charArray.print();
// 컴파일 타임 상수 포인트 사용
Point<5, 10> p1;
Point<-3, 7> p2;
p1.print();
p2.print();
std::cout << "p1과 p2 사이의 맨해튼 거리: "
<< Point<5, 10>::manhattanDistance(p2) << std::endl;
return 0;
}
비타입 템플릿 매개변수는 다음과 같은 상황에서 유용합니다:
- 컴파일 시간에 결정되는 고정 크기 컨테이너
- 컴파일 시간 상수 계산
- 메타프로그래밍 기법
7.3.1 비타입 템플릿 매개변수 제약사항
비타입 템플릿 매개변수는 다음과 같은 타입이 될 수 있습니다:
- 정수 상수 (int, char, bool 등)
- 열거형
- 포인터 및 참조
- nullptr (C++11)
- constexpr 함수 반환 값
- std::nullptr_t (C++11)
C++17부터는 auto를 사용해 템플릿 매개변수 타입을 자동으로 추론할 수 있습니다.
'Programming Languages > C++' 카테고리의 다른 글
| 템플릿 메타프로그래밍 (0) | 2025.03.28 |
|---|---|
| 가변 템플릿(Variadic Templates) (C++11) (0) | 2025.03.28 |
| 클래스 템플릿 기초 (0) | 2025.03.28 |
| 템플릿 (0) | 2025.03.28 |
| 챕터6. 실습 문제 (0) | 2025.03.28 |