On this page
article
C++ Explicit Instantiation
개념
템플릿을 사용하지 않고도 인스턴스화 시키는 것.
- 템플릿을 특정 타입으로 명시적으로 인스턴스화하여 컴파일러가 그 타입에 대한 코드를 생성하게 한다.
함수 예제
#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);
이렇게 하면 int
와 double
타입에 대해서만 square
함수가 인스턴스화되고, 다른 타입에서는 사용 불가하다.