비타입 템플릿 매개변수

2025. 3. 28. 08:47Programming 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