2014-02-17 5 views
3

std::iterator_traits 클래스 템플릿은 iterator_category, value_type, difference_type, pointerreference의 5 가지 중첩 유형을 정의합니다. 모두의 libC++과 된 libstdC++의 <algorithm> 헤더의 소스를 찾아, 하나는 pointer 많은 value_type, difference_typeiterator_category하지만 (std::iter_swap 내부) reference에 대해 하나의 사용과 없음을 볼 수 있습니다.iterator_traits에서 중첩 포인터 유형을 사용하는 것은 무엇입니까?

내 응용 프로그램은 손으로 작성한 프록시 반복자/프록시 참조 쌍을 사용합니다. 나는 부스트 iterator_facade을 사용하여 기본값 인 T&에서 참조 유형을 임의 유형으로 구성 할 수 있지만, 포인터 유형은 기본적으로 T*이 아닙니다. 나는 중첩 된 pointer 타입의 숨겨진 사용법에 물리는 것을 피고 싶다.

: 반복자가 중첩 된 멤버없이 내장 유형에 대한 프록시, 그래서 내가 (되는 반환 형식이 pointer을 것이다) operator->과의 호환성을 필요가 없습니다.

질문 : 중첩 된 유형 pointeriterator_traits의 표준 라이브러리에는 어떤 사용 사례가 있습니까? 이어야한다 나타나는 마지막 두 종류 pointeriterator_traits 내부 reference을 (주로 태그 반복자 기능에 따라 효율적인 버전 디스패치 표준 알고리즘에 의해 사용되는) 제 세 종류 iterator_category, value_typedifference_type 대조적

+1

원래 SGI STL 또는 C++ 표준에서 아무런 용도도 발견되지 않았습니다. 아마 언어 사용자가 표준 라이브러리가 아닌 그것을 사용하는 수단으로 제공되었을 것입니다. – Rapptz

+1

템플릿 유형이 ''에 의해 특수화되어있는 iterator에서 선언 된 타입이 흥미로울 수 있습니다. 여전히 'T *'이지만 다른 모든 곳의'T '는'*'를 잃습니다. – WhozCraig

+0

@WhozCraig tnx 좋은 지적이지만, 만약 내 자신의 iterator에'pointer = void'를 사용한다고 선언한다면, 나는 물릴 수 있습니까? – TemplateRex

답변

1

알고리즘에 의해 사용되지만 반복기 요구 사항을 준수하는지 여부를 정의하는 데 사용됩니다. 일반적인 [iterator.requirements.general]

1에서

24.2.1 [...] 식 (*i).m는 잘 드 인터넷 NED 인 모든 반복자 i 같은 식으로 i->m을 지원 의미는 (*i).m입니다. [...]

24.4.1 반복자 형질 [iterator.traits]

[...] 또한, 유형

iterator_traits<Iterator>::reference 
iterator_traits<Iterator>::pointer 

네드 드 인터넷한다 이터레이터의 참조 및 포인터 유형, 즉 반복자 객체 인 a의 경우 *a 유형과 동일한 유형 과 d a->으로 각각 표시됩니다. [...]

기본값 반복자 요건을 충족 물론 T*T&pointerreference.프록시 참조 관련하여, Boost.Iterator documentation 사실 오랫동안는 반복자 value_type로 전환이기 때문에, 참조하지 않아도

판독 반복기 (오늘날의 입력 반복자)의 reference 형 를 지정한다. 그러나 value_type이 클래스 인 경우 을 통해 에 계속 액세스 할 수 있어야합니다. 따라서 reference 유형이 실제로 참조 인 이 아닌 반복자는 operator->에서 참조 된 값의 사본을 포함하는 프록시를 반환해야합니다.

iterator_facadeoperator->operator[]의 반환 유형은 명시 적으로 지정되어 있지 않습니다. 입니다. 대신, 이러한 유형은 이라는 요구 사항 집합으로 표현되며, 이는 iterator_facade 구현에 의해 충족되어야합니다.

결론 : 한 프록시 반복자가 .m 또는 ->m을 통해 기본 value_type의 멤버에 접근 필요로하지 않기 때문에, 하나 iterator_traits 내부의 pointer 유형에 대해 걱정할 필요하지 않으며, 하나의 프록시 사용을한다해도 iterators, boost::iterator_facade 올바른 일을 할 것입니다.