시작하기 앞서 한가지 중요한 사실을 짚어 본다면 " 함수 템플릿에서 템플릿 매개변수는 함수의 인자에 의해서 추론 된다" 를 알고 있어야 할것 같다. 이 추론 될 수 있음으로 추론 되는 방법을 알아야 되기 때문이다. 이 추론 되는 방법은 함수 오버로딩과 깊은 연관이 있으며, 어떤 함수를 호출할지도 판별하게 되기 때문이다.
우선 컴파일러는 함수 호출 문을 보고, 템플릿 매개변수와 매칭을 시키는데, 이때 함수의 인자가 함수의 템플릿 매개변수를 모두 사용 할 때, 인자를 템플릿 매개변수로써 판별 할 수 있다. 만약 템플릿 매개변수를 함수의 인자로 모두 사용 하지 않는 다면, 명시적으로 <> 에 넣어 주어야만 한다.
이 함수 템플릿과 클래스 템플릿의 큰 차이는 바로 이 추론에 있다. 함수 템플릿은 인자로 추론하여, 템플릿 매개변수를 추론하지만 클래스 템플릿은 추론과정 자체가 없다. 그 이유는 생성자 때문이다. 생성자가 다양하게 제공 되었을 때, 그것들을 컴파일러가 추론하기 힘들거나 추론한다해도 모호해지기 때문에, 아예 특수화를 거쳐서 할 수 있게만 만들어 두었다.
만약 추론된 타입으로 클래스를 생성하고 싶다면, 함수 템플릿으로 그 타입을 추론하고, 그 타입으로 클래스 템플릿은 인스턴스화 하면 된다. 대표적인 예가 boost::make_tuple 이고 std::make_pair 이 있다.
추론 되는 경우와 안되는 경우의 소스 코드
f의 경우, 모든 템플릿 매개변수를 함수의 매개변수로 사용 하므로, 매개변수의 모든 타입을 추론하여, 사용 한다. 그러므로 f는 명시적으로 표현해 줄 필요가 없다.
g의 경우, 모든 템플릿 매개변수를 추론 할 수 없기 때문에, 명시적으로 템플릿 타입을 적어 주어야지만 인스턴스화가 이루어 진다.
보통 g 형식으로 쓰지 않고, 함수의 반환값을 정해 주고자 할때, 명시적으로 템플린 매개변수를 정해 주더라...
총평
이 추론의 의미는 .. 많은 경우에 사용 될 수 있다. 타입 변환이라든지, 클래스 템플릿 생성하기라든지,.. 클래스 템플릿 임시 생성해 그 안에서 일을 처리하게 하고 소멸자에서 할 수 있게 한다든지.. 응용이 무척 많아진다. 여기에 메타템플릿과 결합하면, .. 도깨비 한마리 출현이다.
'책 정리 > C++ Template' 카테고리의 다른 글
C++ Templte 재정리 시작 (0) | 2009.04.03 |
---|---|
C++ 템플릿 : 특수화 함수 템플릿 개념 잡기 (2) | 2008.12.18 |
C++ 템플릿 : 템플릿 특수화 개념 잡기 (0) | 2008.12.18 |
C++ 템플릿 : 기본 템플릿 매개변수 개념 잡기 (0) | 2008.12.17 |
C++ 템플릿 : 템플릿 매개변수 정의하는 알고리즘 (0) | 2008.12.16 |
C++ 템플릿 : 함수 템플릿 오버로딩 이해하기 (0) | 2008.12.15 |
C++ 템플릿 : 함수 탬플릿 정의 하기 (4) | 2008.12.15 |
C++ 템플릿 : 템플릿 매개변수 편 (0) | 2008.12.15 |
C++ 템플릿 : 템플릿 인스턴스화 편 (0) | 2008.12.15 |
C++ 템플릿 : 클래스 템플릿 정의 하기 (0) | 2008.12.15 |
최근댓글