더북(TheBook)

아직은 포인터 문제가 남아 있다. iterator_traits 템플릿은 어떻게 알고리즘이 반복자뿐 아니라 포인터도 사용할 수 있게 했을까? iterator_traits 템플릿에는 T*const T* 타입에 대한 특수화가 정의되어 있다. 예를 들어 템플릿 타입 인수가 포인터 타입 T*일 때 특수화는 다음과 같이 정의되어 있다.

template<class T>
struct iterator_traits<T*>
{
typedef ptrdiff_t                     difference_type;
typedef T                             value_type;
typedef T*                            pointer;
typedef T&                            reference;
typedef random_access_iterator_tag    iterator_category;
};

템플릿 타입 인수가 포인터 타입일 때 별칭 이름에 해당하는 타입을 정의한 것이다. T* 타입의 포인터의 경우 value_type 별칭은 항상 T가 된다. Box* 타입의 포인터를 my_swap()에 인수로 사용한다면 value_type 별칭은 Box가 되고, tmpBox 타입이 된다. 랜덤 액세스 반복자 카테고리에 필요한 모든 연산은 포인터에 적용할 수 있으므로 iterator_category 별칭은 항상 포인터에 대해 std::random_access_iterator_tag와 같은 표현이 된다. 따라서 iterator_traits 템플릿이 동작하는 방식은 템플릿 타입 인수가 포인터이냐, 반복자 클래스 타입이냐에 따라 다르다. 템플릿 타입 인수가 포인터이면 포인터를 위한 iterator_traits의 특수화가 선택될 것이고, 그렇지 않은 경우엔 표준 템플릿 정의가 선택될 것이다.

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