Template Specialization & Instantiation

MySprtlty·2023년 1월 21일
0

C++

목록 보기
2/2

5년 전에 원노트에 정리했던 내용을 벨로그로 옮기는 작업을 하고 있다.

🏷️Specialization(특수화)

  • 말 그대로 함수 템플릿나 클래스 템플릿 중 타입을 지정하는 특수한 케이스를 정의하는 것을 뜻한다.
  • 특수화엔 두가지 종류가 있다.

📌명시적 특수화(전체 템플릿 특수화)

  • 모든 템플릿 매개변수의 타입을 지정해서 정의하는 것이다.
  • 클래스 템플릿과 함수 템플릿 모두 가능하다.

1. Class Explicit Specialization(Total Template Specialization)

template <>
class Foo<int, int>
{
	T1 a;
	T2 b;
	...
}

2. Function Explicit Specialization

template <>
T1 bar<int, int>(int a, int b)
{
	...
}

📌부분 특수화

  • 일부 템플릿 매개변수의 타입을 지정해서 정의하는 것이다.
  • 클래스 템플릿만 가능하고, 함수 템플릿은 안된다.

1. Class Template Partial Specialization

template <typename T2>
class Foo<int, T2>
{
	T1 a;
	T2 b;
	...
}
  • 함수 템플릿는 부분 특수화는 불가능하지만, 오버로딩을 사용하면 된다.
    • 그러나 명시적 특수화된 함수들보다 위에 정의되어 있어야 한다.
  • 한 함수 템플릿에게 명시적 특수화와 오버로딩을 같이 사용하는 프로그래밍은 지양하는 것이 좋다.
    • 명확하지 않은 함수 템플릿이 구체화될 수 있기 때문이다.

2. Function template Overloading

template <typename T1, typenameT2>
T1 bar(T1 a, int b)
{
	...
}
  • 사용하지 않는 템플릿 매개변수는 빼주어야 제대로 동작한다.
  • 일반 함수로 오버로딩 할 수도 있다.

3. Normal Function Overloading

int bar(int a, int b)
{
	...
}

📌호출 우선 순위

  • 일반 함수 > 명시적 특수화 함수 템플릿 > 함수 템플릿 오버로딩 > 함수 템플릿

🏷️Instantiation(구체화)

  • 구체화는 컴파일러가 특정 데이터 타입에 맞는 함수의 정의를 생성하기 위해 템플릿을 사용하는 것을 뜻한다.
  • 구체화엔 두가지 종류가 있다.

📌암시적 구체화

  • 함수 템플릿을 호출하는 경우, 컴파일러가 함수의 인자의 데이터 타입을 분석 알아서 구체화 하는 것이다.
  • 클래스 템플릿을 생성하는 경우, 컴파일러가 클래스 생성자를 통해서 타입 추론하는 방법이다. (C++17이상)
  • 클래스 템플릿의 경우 사용하지 않는 멤버 함수는 인스턴스화 되지 않는다. (lazy instantiation)

📌명시적 구체화

  • 템플릿을 사용해서 특정 타입의 함수나 클래스를 생성해 달라고 명시적으로 지시하는 것이다.
  • 클래스 템플릿의 명시적 구체화는 다음과 같이 사용한다.
template class Foo<int>;
  • 함수 템플릿의 명시적 구체화는 다음과 같이 사용한다.
template int bar<int>(int);
  • 명시적으로 타입을 지정하여 함수를 호출 할 수 있다.
bar<int>(인자);
profile
2Co 4:7

0개의 댓글