클래스 템플릿 정의

클래스 정의 위에 

template <typename T>

template <class T>

둘 중 하나를 붙여 템플릿을 정의한다.

 

템플릿은 인스턴스화 되기 전까지는 컴파일 시에 아무런 코드로 변환되지 않는다.

= 템플릿은 컴파일 시에 인스턴스화 된다.

 

템플릿 특수화

template <typename T>
class Vector {
  T* data;
  int capacity;
  int length;
}

// 템플릿 특수화 bool을 템플릿 인자로 전달하는 경우
template <>
class Vector <bool>{
  unsigned int* data; // bool* data로 쓰게 되면 원소 하나당 1byte씩 쓰기 때문에 1bit로 표현하기 위함이다.
  int capacity;
  int length;
}

 

함수 템플릿

template <typename T>
T max(T& a, T& b) {
  return a > b ? a : b;
}

int main(void){
  int a = 3;
  int b = 5;
  cout << max(a, b); // C++ 컴파일러가 max<int>(a, b)로 인식하여 처리해줌
}

 

 

함수 객체(Functor)

ㄴ 함수는 아니지만 operator()를 내부에 구현하여 함수인척 하는 객체

ㄴ sort 함수에 템플릿 인자로 넣어 오름차순, 내림차순을 설정할때 사용하기도 한다.

 

타입이 아닌 템플릿 인자

template <typename T, int num>
T add_num(T t) {
  return t + num;
}

템플릿 인자로 전달할 수 있는 타입들은 제한적이다.

ㄴ 정수 타입, (float, double) 제외

ㄴ 포인터 타입

ㄴ enum 타입

ㄴ 널포인터 (std::nullptr_t)

 

예시) 함수를 배열을 전달할 때 배열의 크기를 잃어버린다는 문제가 있었는데, C++11의 std::array를 사용하여 배열을 생성할 경우 템플릿 인자로 배열의 크기를 명시할 수 있게 되었다.

std::array<int, 5> arr = {1, 2, 3, 4, 5};

// arr.size()로 배열 크기에 대한 정보 획득 가능

 

디폴트 템플릿 인자

template <typename T>
struct Compare {
  bool operator()(const T& a, const T& b) const { return a < b; }
};

template <typename T, typename Comp = Compare<T>>
T Min(T a, T b) {
  Comp comp;
  if (comp(a, b)) {
    return a;
  }
  return b;
}

// Min함수 템플릿은 피연산자로 정수가 오든 문자열이 오든 처리가 가능하다

 

참조:

https://modoocode.com/219

+ Recent posts