다시 읽기 STL 소스 코드 분석 : 반복자

첫 번째 반복자에 :

데이터 컨테이너 반복기에 의해 산출되는 반복자 목적은, 밀착성 및 알고리즘 매체로 알고리즘 반복자위한 컨테이너이다.

입력에 대응 :

요소가 같은 동일한 클래스 반복자 뾰족한 소자의 문에 변수로서, 용기의 변수 타입을 사용해야 때때로 용기에서 동작하고, 상기 알고리즘에있어서, 이러한 처리 시간이 매우 곤란하다.

용액 함수 마지막 파라미터 도출을 사용한다 :

서식 <클래스 I> 
인라인 공극 FUNC (I는 ITER) 
{ 
  func_impl (ITER * ITER);  
} 

템플릿 <클래스 I, 클래스 T> 
공극 func_impl (I는 T (T)를 ITER) 
{ 
  T TMP;      
}

 

왜 인터페이스로 여기 FUNC 싶어하지만, 실제 작업은 그것을 func_impl 수 있나요?

(내가 요소로 반복자 포인트에 해당하고, 반복자에 내가 및 동등한) (i)를 FUNC : 이것은 우리가 전화했을 때, 바로 전화를 같은 방법으로 같은 반복자를 전달하려는 때문입니다

그래서 하나 개의 패키지를 사용하지 않을 경우 반면 :

서식 <클래스 I, 클래스 T> 
공극 FUNC (I는 T (T)를 ITER) 
{ 
  T TMP;  
}

 이 문제는 당신이 FUNC를 사용할 때마다이 반복자를 노출되는 요소를 가리키는 것입니다 :

 FUNC (I, I);

 이 경우 FUNC에서 (내가) 등의 호출은 불법입니다.

 그래서 레이어 패키지이 설계 모델에 맞춰 호출 더 할 수 있습니다 추가, 모든 것이 곧 반복자 이하에 숨겨져 있습니다.

 사실, 모든 FUNC 먼저 (ⅰ) FUNC (INT의 *)의 제 도출 I를 입력하고, 상기 제 파라미터의 유도 소자를 통해 가리키는 반복자 타입 (INT, INT)을 호출 func_impl 나타나면, func_impl 양도 INT을, T는 INT는 INT는 다음의 tmp를 만들 파생됩니다.

 

프로그래밍 기술 특성 :

위의 논의에서, 카테고리의 알고리즘을 구현하는 요소는 함수 반복자 포인트 내에서 선언하지만, 값을 반환해야합니다 알고리즘 인 경우 반복자 클래스는 요소로 지적?

이 경우, 상기와 같이,이 기능을 달성 할 수 없다.

템플릿 선언 요소 내에서 반복자 타입 T가 VALUE_TYPE가 가리키는 반복자 경우에 따라서 거물은 반복자의 디자인에 생각을 바꿨다.

즉 :

템플릿 <클래스 T> 
구조체 반복자 
{ 
  T value_type이라는 형식 정의; 
  T의 *의 PTR; 
  .......     
}

  이러한 방법으로, 우리는 반복자의 형태로 변수를 선언 할 수 있습니다 :이 변수의 VALUE_TYPE는 다른 요소 유형 반복자 점이다.

템플릿 <클래스 I> 
유형 이름 I :: VALUE_TYPE의 
FUNC (나는 ITE) 
{ 
  유형 이름 I :: VALUE_TYPE TMP;  
}

  우리는 함수 func에 호출하는 경우 따라서, 상기 내부에 반복자를 통과를, 나는 반복자 유형에 대한 작동하지 않습니다 템플릿 판단되며, 이에 따라, 입력 반복자 가치를 가리키는 값이 입력 판단 돌아갑니다 우리 때문에 반복자 내부는 VALUE_TYPE의 유형으로 선언되었다. 동시에, 우리는 또한이 방법의 요소에 대한 반복자 반복자 포인트 내에서 선언 된 변수를 사용할 수 있습니다.

  그것은 매우 영리 보이지만,이 방법은 문제가있다 :

문제는 우리가 이런 방식으로 반환 값의 유형과 변수의 요소에 대한 반복자 포인트 내에서 선언 알고리즘의 유형을 도출하는 경우는 내부에 선언 된 요소를 가리키는 유형을 요청해야한다는 것입니다 다른 반복자는 VALUE_TYPE입니다 . INT의 *처럼 숯불 * 이러한 유형, 그들은 기본 데이터 유형은, 때문에 그러나이 경우 기본 데이터 유형은 우리가 인위적으로 내부 타입 정의 INT VALUE_TYPE이 선언을 추가 할 수없는, 할 수 없습니다.

이 기본 INT * 포인터를 제외하는 경우 그러나, 여전히 이해가 반복자 디자인을?

 

상기 과제에 거물 부분 템플릿을 전문화함으로써이 문제를 해결한다.

부분 템플릿 특수화는 파생 사용하는 템플릿의 유형을 선택 실제로 가까이 동안 파생 된보다 구체적인 템플릿을 제공하는 것과, 따라서 원래의 부분 특수화 포인터 디자인의이 버전을 해결할 수 있습니다.

다른 템플릿 정의를 제공하기위한 부분 특수화는 여전히 템플릿 자체이지만, 템플릿 매개 변수 추가 조건을 추가했다.

예를 들면 :

템플릿 <TYPENAME T> 
클래스 A 
{ 
	T value_type이라는 형식 정의; 
}; 
서식 <TYPENAME T> 
A 급 <T *> 
{ 
	T의 VALUE_TYPE 타입 정의; 
};

  사용하는 경우에있어서, <지능 *> a 및 가까운 포인터의 형태로 T * T와 비교하여, 첫 번째에 비해 INT * 제 템플릿이 사용될 때.

또한 두 번째는 당신이 삭제하면 템플릿이 첫 번째 오류 수 있다는 것을 의미하는, 혼자 존재할 수 있습니다, 부분 특수화가 존재하는 가장 일반적인 템플릿에 따라 달라집니다.


이제, 우리는 핵심 특성 프로그래밍 기술의이 부분을 도입 할 수 있습니다 :

첫째,이 템플릿 클래스를 보면 :

템플릿 <클래스 I> 
구조체 iterator_traits 
{ 
  형식 정의 유형 이름 I :: VALUE_TYPE VALUE_TYPE;  
}

  이 템플릿은 템플릿의 모든 부분 특수화이 버전을 기반으로하는 것을 의미 가장 만다린 템플릿입니다.

함수 FUNC 이전에 쓴 지금 보면 :

템플릿 <클래스 I> 
유형 이름 iterator_traits <I> :: VALUE_TYPE 
FUNC (나는 ITE) 
{};

  이제, 우리는 I와 리턴 값의 타입이 VALUE_TYPE 반복자 클래스 유형의 내부 설정 유형을 추론 자동 전달 기능 FUNC 및 반복자를 호출하는 경우.

모든 유형은 다음 반복자에 통합되어, 우리는 모든 요소를 ​​가리키는 반복자를 사용할 수 있도록 또한, 우리는 T의 *와 같은 부분 전문의 수를 설계하는이 템플릿을 사용할 수 const를 T *는 알고리즘을 추론 할 수있다 해당 유형.

카테고리 vlaue_type 반복자에만 다른 형태의 대응하는 소자에 관한 것으로, 많은 후술 확장있다.

 

추천

출처www.cnblogs.com/lxy-xf/p/11391189.html