개념

템플릿을 사용하지 않고도 인스턴스화 시키는 것.

  • 템플릿을 특정 타입으로 명시적으로 인스턴스화하여 컴파일러가 그 타입에 대한 코드를 생성하게 한다.

함수 예제

  #include <iostream>

template<typename T>
void fn(T a) {}

// 명시적 인스턴스화
template void fn<int>(int);
template void fn<>(double);
  
  • template void fn<int>(int); : fn<int> 인스턴스 생성
  • template void fn<>(double); : fn<double> 인스턴스 생성

클래스 예제

  template<class T>
class Type {
    void mf1() {}
    void mf2() {}
};

// 명시적 인스턴스화
template class Type<int>;         // 전체 클래스 인스턴스화
template void Type<double>::mf1(); // 특정 멤버 함수만 인스턴스화
  

필요 이유

  • 템플릿 구현부를 다른 파일에 나눠서 작성했을 때, 명시적 인스턴스화를 사용하면 특정 타입만 인스턴스화하고 나머지는 막을 수 있다.
  • 예를 들어, int, double 타입만 사용하도록 제한할 수 있다.
  // square.cpp

template<typename T>
T square(T a) {
    return a * a;
}

// 명시적 인스턴스화
template int square(int);
template double square(double);
  

이렇게 하면 intdouble 타입에 대해서만 square 함수가 인스턴스화되고, 다른 타입에서는 사용 불가하다.