임의의 반복자 타입에서 필요한 타입 정보를 추출해서 알고리즘에서 일반화된 방법으로 반복자를 다룰 수 있게 도와줍니다.
struct iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef difference_type distance_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};
iterator_category : 반복자의 카테고리를 추출합니다.
<예시>
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
int main() {
std::cout << "vector: " << typeid(std::vector<int>::iterator::iterator_category).name() << std::endl;
std::cout << "list: " << typeid(std::list<int>::iterator::iterator_category).name();
return 0;
}
결과
value_type : 반복자가 가리키는 값의 타입을 추출합니다.
<예시>
#include <iostream>
#include <vector>
#include <iterator>
int main() {
std::cout << "value_type: " << typeid(std::vector<int>::iterator::value_type).name() << std::endl;
return 0;
}
결과
difference_type : 두 반복자 간의 거리 타입을 제공합니다. (ptrdiff_t)
distance_type : 표준에서 제외된 difference_type의 별칭
<예시>
#include <iostream>
#include <vector>
#include <iterator>
int main() {
std::vector<int> vec = { 1, 2, 3, 4 };
std::vector<int>::iterator it1 = vec.begin();
std::vector<int>::iterator it2 = vec.end();
std::vector<int>::iterator::difference_type diff = it2 - it1;
std::cout << diff;
return 0;
}
결과
pointer : 반복자가 가리키는 타입의 포인터 타입을 추출합니다.
reference : 반복자가 가리키는 타입의 레퍼런스 타입을 추출합니다.
<예시>
#include <iostream>
#include <vector>
#include <iterator>
#include <type_traits> // is_same
int main() {
std::vector<int> vec = { 1, 2, 3 };
std::vector<int>::iterator it = vec.begin();
std::iterator_traits<std::vector<int>::iterator>::pointer p = &(*it);
std::iterator_traits<std::vector<int>::iterator>::reference r = *it;
std::cout << typeid(p).name() << '\n';
std::cout << std::is_same<int&, decltype(r)>::value;
// 두 타입이 같으면 true, 다르면 false를 출력하는 템플릿 구조체
return 0;
}
결과
