더북(TheBook)

반복자를 매개변수로 갖는 함수 템플릿을 정의할 때 iterator_traits 템플릿이 정의하는 표준 타입 별칭 이름을 타입으로 사용할 수 있다. 따라서 MyIterator 타입의 반복자가 표현하는 포인터 타입은 항상 std::iterator_traits<MyIterator>::pointer로 참조할 수 있다. 왜냐하면 이는 MyIterator::pointer로 표현한 것과 같기 때문이다. MyIterator 반복자가 가리키는 value의 타입을 지정해야 할 때는 std::iterator_traits<MyIterator>::value_type이라고 쓸 수 있다. 이는 MyIterator::value_type으로 매핑될 것이다. iterator_traits 템플릿 타입 별칭을 my_swap() 템플릿에 적용해서 tmp의 타입을 다음과 같이 지정하는 것도 가능하다.

template <typename Iter>
void my_swap(Iter a, Iter b)
{
  typename std::iterator_traits<Iter>::value_type tmp = *a;
  *a = *b;
  *b = tmp;
}

여기서는 tmp의 타입을 iterator_traits 템플릿의 value_type 별칭으로 지정했다. my_swap() 템플릿이 Iter 템플릿 인수로 인스턴스화될 때 tmp의 타입은 반복자가 가리키는 타입, Iter::value_type이 될 것이다.

무슨 일이 벌어지는지 정확히 이해하고, 문제를 어떻게 해결하는지 알아보기 위해 my_swap() 템플릿 인스턴스의 특이한 상황을 하나 생각해보자. 다음 코드가 포함된 프로그램이 있다고 해보자.

std::vector<std::string> words {“one”, “two”, “three”};
my_swap(std::begin(words), std::begin(words)+1); // 처음 두 원소를 교환한다
 

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