더북(TheBook)

반복자 인수가 가리키는 값의 타입을 결정할 수 있는 추가 메커니즘도 있다. 예를 들어 my_swap()에서 이용하는 모든 반복자 타입은 반복자가 가리키는 객체의 타입으로 value_type을 포함해야 한다고 하는 것이다. 이 경우 반복자 클래스에서 my_swap() 함수 템플릿의 tmp 타입 지정에 value_type 별칭을 사용할 수 있다.

template <typename Iter> void my_swap(Iter a, Iter b)
{
  typename Iter::value_type tmp = *a;     // 개선됨 - 하지만 제약이 있음...
  *a = *b;
  *b = tmp;
}

value_type 별칭이 Iter 클래스에 정의되어 있으므로 value_type을 참조하려면 클래스 이름과 함께 써야 한다. 이 방식은 value_type 별칭을 정의한 클래스 타입의 반복자에서는 잘 동작할 것이다. 그러나 STL 알고리즘은 반복자뿐 아니라 포인터와도 잘 동작한다. 즉, Iterint* 같은 일반 포인터 타입이거나 Box가 클래스 타입일 때 Box* 같은 타입이라면 이런 방식의 코드는 동작하지 않는다. 왜냐하면 포인터 타입은 타입 별칭을 포함할 수 있는 클래스가 아니기 때문이다. STL은 이 문제와 이와 관련된 다른 문제들을 매우 우아하게, 즉 템플릿을 사용해서 해결했다. 달리 무엇이겠나!

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