시작하기 앞서 한가지 중요한 사실을 짚어 본다면 " 함수 템플릿에서 템플릿 매개변수는 함수의 인자에 의해서 추론 된다"  를 알고 있어야 할것 같다. 이 추론 될 수 있음으로 추론 되는 방법을 알아야 되기 때문이다. 이 추론 되는 방법은 함수 오버로딩과 깊은 연관이 있으며, 어떤 함수를 호출할지도 판별하게 되기 때문이다.


우선 컴파일러는 함수 호출 문을 보고, 템플릿 매개변수와 매칭을 시키는데, 이때 함수의 인자가 함수의 템플릿 매개변수를 모두 사용 할 때, 인자를 템플릿 매개변수로써 판별 할 수 있다.  만약 템플릿 매개변수를 함수의 인자로 모두 사용 하지 않는 다면, 명시적으로 <> 에 넣어 주어야만 한다.


이 함수 템플릿과 클래스 템플릿의 큰 차이는 바로 이 추론에 있다. 함수 템플릿은 인자로 추론하여, 템플릿 매개변수를 추론하지만 클래스 템플릿은 추론과정 자체가 없다. 그 이유는 생성자 때문이다. 생성자가 다양하게 제공 되었을 때, 그것들을 컴파일러가 추론하기 힘들거나 추론한다해도 모호해지기 때문에, 아예 특수화를 거쳐서 할 수 있게만 만들어 두었다.

만약 추론된 타입으로 클래스를 생성하고 싶다면, 함수 템플릿으로 그 타입을 추론하고, 그 타입으로 클래스 템플릿은 인스턴스화 하면 된다. 대표적인 예가 boost::make_tuple 이고 std::make_pair 이 있다.


추론 되는 경우와 안되는 경우의 소스 코드

f의 경우, 모든 템플릿 매개변수를 함수의 매개변수로 사용 하므로, 매개변수의 모든 타입을 추론하여, 사용 한다. 그러므로 f는 명시적으로 표현해 줄 필요가 없다.

g의 경우, 모든 템플릿 매개변수를 추론 할 수 없기 때문에, 명시적으로 템플릿 타입을 적어 주어야지만 인스턴스화가 이루어 진다.

보통 g 형식으로 쓰지 않고, 함수의 반환값을 정해 주고자 할때, 명시적으로 템플린 매개변수를 정해 주더라...


총평

이 추론의 의미는 .. 많은 경우에 사용 될 수 있다. 타입 변환이라든지, 클래스 템플릿 생성하기라든지,.. 클래스 템플릿 임시 생성해 그 안에서 일을 처리하게 하고 소멸자에서 할 수 있게 한다든지.. 응용이 무척 많아진다. 여기에 메타템플릿과 결합하면, .. 도깨비 한마리 출현이다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기