더북(TheBook)

이제 컴파일러는 iterator_traits 인스턴스에서 iterator_traits<iterator<std::string>>::value_typeiterator<std::string>::value_type의 별칭이고, iterator<std::string> 클래스 정의에서 iterator<std::string>::value_typestd::string의 별칭이라는 것을 알고 있다. 별칭을 하나씩 따라가면서 실제 타입에 도달하면 컴파일러는 my_swap()에서 tmp의 정의를 다음과 같이 결론 내릴 수 있게 된다.

std::string tmp = *a;

정말 간단하지 않은가!

템플릿은 코드가 아니라는 사실을 꼭 새겨 두자. 템플릿은 컴파일러가 코드를 생성하기 위해 사용하는 레시피다. iterator_traits 템플릿은 타입 별칭만 담고 있을 뿐이므로 실행 코드를 생성하지 않는다. 컴파일러는 컴파일할 C++ 코드를 생성하는 과정으로 이 템플릿을 이용할 뿐이다. 컴파일된 코드에서는 iterator_traits의 흔적을 전혀 찾을 수 없다. 즉, 이 템플릿의 용도는 C++ 코드를 생성하는 과정에 있을 뿐이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.