더북(TheBook)

2.7.2.1 반복자 템플릿 사용하기

STL에는 직접 반복자 클래스를 만들 때 필요한 타입 별칭을 쉽게 넣을 수 있는 iterator 템플릿이 정의되어 있다. iteratoriterator_traits 템플릿의 다섯 가지 타입 별칭을 정의한 struct 템플릿이다.

template<class Category, class T, class Difference = ptrdiff_t, class Pointer = T*,
                                                                              class Reference = T&>
struct iterator
{
typedef T           value_type;
typedef Difference  difference_type;
typedef Pointer     pointer;
typedef Reference   reference;
typedef Category    iterator_category
};

이 템플릿은 STL에 필요한 반복자 타입을 모두 정의하고 있다. 예를 들어 미확인 템플릿 매개변수 Iter를 갖고 있다면 타입에 대한 포인터를 선언해야 할 때 Iter::pointer라고 쓸 수 있고 Iter::pointer를 역참조하면 반복자를 제공한다. iterator_category의 값은 1장에서 소개한 카테고리 태그 클래스 중에 하나여야 한다. 반복자 클래스를 정의할 때 iterator 템플릿의 인스턴스를 기반 클래스로 쓸 수 있고, 이렇게 하면 구현하는 클래스에 필요한 타입 별칭을 추가하게 된다.

class My_Iterator : public std::iterator<std::random_access_iterator_tag, int>
{
  // My_Iterator 클래스의 멤버들...
};

이 코드는 STL에서 반복자에 필요한 모든 타입 정의를 처리해준다. 템플릿의 첫 번째 인수는 반복자의 타입을 랜덤 액세스 반복자로 지정했다. 두 번째 인수는 반복자가 가리키는 객체의 타입이다. iterator의 마지막 템플릿 인수 세 개는 기본값을 지정한 것이므로 세 번째 인수는 두 반복자의 간격(difference)을 나타내는 타입, 즉 ptrdiff_t가 된다. 네 번째 인수는 객체에 대한 포인터의 타입이므로 int*이 된다. 마지막 템플릿 인수는 참조를 위한 타입이므로 int&가 된다. 물론, iterator 타입은 어떤 일도 하지 않는다. 따라서 모든 멤버는 여전히 정의해야 한다.

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