イテレータの基本クラスといくつかの派生クラスを書くには?反復子継承と継承* this
イテレータはそれ自体(* this)を返す必要がありますか?
これまで、typename X
とstatic_cast<X&>(*this)
を使用して、派生クラスがそれ自身を基本クラスから返す関数を継承できるようにしました。
This
醜いです。より良い方法がありますか?
簡体コード:
#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'は、2つの無関係な公共' Tを持っています* p'メンバーです 混沌。 –
私はcrtpを知らなかった。この場合、crtpの助けになるでしょうか? – rxu
簡単な修正:T * pを非公開に変更します。それを保護されたものに変更することはできません。いくつかの方法。私は前に試しました。 – rxu