2009-09-30 3 views
3

인덱스 생성 함수 std :: distance (a, b)에 "기억하기 쉬운"인터페이스를 얻기 위해 을 와std :: vector 및 iterator를 단일 템플릿으로 사용 typename

std::vector<MyType> vect; 
std::vector<MyType>::const_iterator iter; 
... 
... 
size_t id = vectorindex_of(iter, vect); 

: 처럼 벡터 와 그 반복자와 템플릿 함수를 호출하여 : (vec.begin() 벡터의 기본에 대해 사용하는 경우) 그것의 더 나은 구분의 생각은 인수를의 결코 의 순서를 혼동하지 않는 이유는 ;-)

위 아이디어의 명백한 공식은 sth를 읽습니다. like

template <typename T> 
inline 
size_t vectorindex_of( 
      typename std::vector<T>::const_iterator iter, 
      const std::vector<T>& vect) { 

    return std::distance(vect.begin(), iter); 
} 

... 작동하지만 어색해 보입니다.

나는 암시 템플릿 메커니즘이 (의사 코드)와 같은 유형을 을 추론 싶어요 : 작동하지 않습니다

template <typename T> 
inline 
size_t vectorindex_of(T::const_iterator iter, const T& vect) { 
    return std::distance(vect.begin(), iter); 
} 

을 .... 하지만 왜?

답변

8

수정이 쉽습니다. T::const_iterator iter 앞에 typename을 추가하십시오. 클래스 템플릿이 특수화 될 수 있고 typename을 사용하면 컴파일러에서 형식 이름이 T::const_iterator이고 값이나 다른 값이 아닌 것으로 예상되므로이 작업이 필요합니다.

덜 일반적인 기능에서도 동일한 작업을 수행합니다.

2
template <typename T> 
inline 
std::size_t vectorindex_of(typename T::const_iterator iter, const T& vect) { 
    return std::distance(vect.begin(), iter); 
} 

잘 작동해야합니다 (typename에 표시). 템플릿 인수는 어느 경우에도 추론되어야합니다.

+0

이 간단한 수정을 알려 주셔서 감사합니다. 귀하의 답변을 모두 "수락 된 답변"으로 표시하고 싶지만 한 가지만 가능합니다 ;-) –

1

또한 벡터 반복자의 인덱스 얻기 위해 "쉽게 기억하기"방법에 관심이있을 수 있습니다

전 - vec.begin()

그것은 무작위로 연산을 포인터와 동일의를 반복자에 액세스하십시오!

관련 문제