C++/Templates 2021. 3. 21. 23:59

자료형이 아닌 템플릿 매개변수 (Non-type Templates Parameters)

  • 템플릿 매개변수는 컴파일 타임에 결정되어야 한다.

    • 템플릿의 원리가 여러 경우에 대해 컴파일을 따로 해주는 것이기 때문이다.
  • Non-type 파라미터를 사용할 경우 헤더에서 함수를 정의한다.

    • template<typename T, unsigned int T_SIZE>와 같이 unsigned int가 온다고 생각해보자.

    • 모든 숫자에 대해 explicit instantiation을 적용할 수는 없으므로 헤더에서 정의하는 것이다.


예제

main.cpp

  #include "MyArray.h"

  int            main()
  {
    MyArray<double, 10> my_array;

    for (int i = 0; i < my_array.getLength(); ++i)
      my_array[i] = i * 0.5;

    my_array.print();
  }

  /* stdout
  0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
  */

MyArray.h

  #pragma once
  #include <iostream>
  #include <cassert>

  template<typename T, unsigned int T_SIZE>
  class MyArray
  {
    T*        data_;

  public:
    MyArray()
    {
      data_ = new T[T_SIZE];
    }

    ~MyArray()
    {
      delete[] data_;
    }

    T& operator[](int index)
    {
      assert(index >= 0 && index < T_SIZE);
      return data_[index];
    }

    int getLength()
    {
      return T_SIZE;
    }

    void print()
    {
      for (int i = 0; i < T_SIZE; ++i)
        std::cout << data_[i] << ' ';
      std::cout << std::endl;
    }
  };