반복기의 기본 클래스 및 여러 파생 클래스를 작성하는 방법은 무엇입니까?Iterator 상속 및 상속 * this
반복자가 자신을 반환해야합니까 (* this)?
지금까지는 파생 클래스가 기본 클래스에서 자신을 반환하는 함수를 상속 할 수 있도록 typename X
및 static_cast<X&>(*this)
을 사용했습니다.
This
ugly. 더 좋은 방법이 있습니까?
간체 코드 :
#include <iterator>
#include <iostream>
template <typename T, typename X>
class BaseIterator : public std::iterator<std::input_iterator_tag, T> {
//Not intended to be used directly.
private:
T* p;
protected:
virtual void increment(void)=0;
virtual T* stride_index(int index)=0;
public:
virtual ~BaseIterator(){} //virtual destructor.
X operator++(int) { //takes a dummy int argument
X tmp(static_cast<X&>(*this));
increment();
return tmp;
}
bool operator==(const X & rhs) { return p==rhs.p; }
} ;
template <typename T>
class ContiguousIterator : public BaseIterator<T, ContiguousIterator<T> > {
private:
T* p;
protected:
inline void increment(void) {++p;}
inline T* stride_index(int index){return p + index;}
public:
virtual ~ContiguousIterator(){} //destructor.
ContiguousIterator(T* x) :p(x) {}
ContiguousIterator(const ContiguousIterator<T> & mit) : p(mit.p) {}
} ;
int main(void){
int i[]={0,1,2,3,4,5};
ContiguousIterator<int> itbegin(i);
ContiguousIterator<int> it(i);
it++;
std::cout << "result: " << (it == itbegin) << std::endl;
}
대안은 적은 코드를 작성하기 위해 상속을 사용하여 잊어하는 것입니다. 복사 한 후 *this
을 반환하는 함수를 파생 클래스에 붙여 넣기 만하면됩니다. 대안은 나에게 점점 허용 보인다
... 일반적으로
또한,'ContiguousIterator' 두 관련이없는 공공'T를 가지고 * p' 회원입니다. 혼돈. –
나는 crtp를 몰랐다. 이 경우 crtp 도움이 될까요? – rxu
간단한 수정 : T * p를 비공개로 변경하십시오. 보호 대상으로 변경할 수 없습니다. 어떤 방법. 나는 전에 시험했다. – rxu