:
수동과 같은 템플릿을 인스턴스화 할 수 있습니다. 컴파일러는 함수를 호출 할 때까지 (또는 더 정확하게 인스턴스를 생성 할 때까지) tmp
이 무엇인지 모르기 때문에 코드를 작성하는 방법을 알지 못합니다. T
는, 정수 다음 함수 본문은 정수 추가하는 경우
template <typename T>
T add(T left, T right) {
return left + right;
}
예를 들어,이 템플릿을 고려하십시오. T
이 double이면 부동 소수점 추가입니다. T
이 std::string
인 경우 std::string::operator+
에 대한 함수 호출입니다.
C++ 프로그램에는 많은 유형이 있으므로 그 중 많은 유형을 추가 할 수 있으며 거의 모든 유형이 다른 방식으로 추가됩니다.이 유형을 알기 전까지는 함수의 코드를 작성할 수 없습니다. 가능한 모든 유형 T
에 대해이를 수행하려고 시도하면 가능한 구현의 조합 폭발이 발생합니다. 거의 대부분이 사용되지 않습니다. 컴파일 타임과 바이너리 크기가 크다면 이익은 크지 않을 것입니다.
class templates의 경우 다소 복잡합니다. 클래스 템플릿의 인스턴스화는 실제로 호출되지 않으면 모든 함수를 인스턴스화 할 필요가 없습니다. 우리가 대신 쓴 경우, 예제로 돌아 간다 : 컴파일러가 add<int>
잠재적으로 흥미 알고있는 모든 정보를 가지고 있더라도 실제로 을하지 않기 때문에
template <typename T>
class Adder {
T add(T left, T right) {
return left + right;
}
};
Adder<int> a;
이 여전히는 Adder<int>::add
을 인스턴스화 할 것을 호출하거나 인스턴스화합니다.
* 템플릿 기능 *이 아닙니다. 이것은 * 함수 템플릿 *입니다. 그것은 기능이 아니라 미래 기능의 청사진입니다. 그것은 완전히 중요하지 않습니다.'func'은 * 템플릿 함수 *, 즉 모든 템플릿 매개 변수가 이미 알려진 * 함수 템플릿 *이됩니다. 이 * 템플릿을 인스턴스화하여 "materialize"합니다. –
AnT