std::iterator_traits
std::iterator_traits (반복자 특성)
LegacyIterator 타입의 속성에 통일된 인터페이스를 제공하는 타입 특성 클래스예요. 알고리즘을 반복자만으로 구현할 수 있게 해줘요.
출처: cppreference
본문
<iterator> 헤더에 정의돼 있어요.
template< class Iter >
struct iterator_traits;
template< class T >
struct iterator_traits<T*>;
template< class T >
struct iterator_traits<const T*>;
std::iterator_traits는 LegacyIterator 타입의 속성에 통일된 인터페이스를 제공하는 타입 특성 클래스예요. 이 덕분에 알고리즘을 반복자만으로 구현할 수 있어요. 사용자 정의 반복자를 위해 특수화할 수 있어, 타입이 일반적인 typedef를 제공하지 않아도 반복자 정보를 얻을 수 있어요. 사용자 특수화는 반복자 컨셉 준수를 나타내기 위해 중첩 타입 iterator_concept을 반복자 카테고리 태그 중 하나로 정의할 수 있어요(C++20부터).
템플릿 매개변수
Iter— 속성을 얻을 반복자 타입
멤버 타입
| 중첩 타입 | 정의 |
|---|---|
difference_type |
Iter::difference_type |
value_type |
Iter::value_type |
pointer |
Iter::pointer |
reference |
Iter::reference |
iterator_category |
Iter::iterator_category |
Iter이 다섯 타입 중 어떤 것도 가지지 않으면, std::iterator_traits의 해당 멤버 타입은 iterator_traits의 기본 정의 규칙(예: *Iter이 참조 가능한 경우 등)에 따라 결정되지 않을 수 있어요. 포인터에 대한 특수화는 포인터 타입에 알맞은 멤버 타입을 제공해요.
예제
#include <iterator>
#include <vector>
#include <type_traits>
int main()
{
using It = std::vector<int>::iterator;
static_assert(std::is_same_v<std::iterator_traits<It>::value_type, int>);
static_assert(std::is_same_v<std::iterator_traits<It>::iterator_category,
std::random_access_iterator_tag>);
}