私はラッパー クラスを独自のイテレータと共に記述して、それらのクラスとそのイテレータの両方のスーパークラスを記述できるようにしようとしstd::list
てstd::vector
います。私の現在のコードは基本的に次のようになります。
template <class T>
class MyCollection
{
//Not sure how to write this class.
public:
class iterator
{
//Not sure how to write this class either
//I think MyVector::iterator and MyList::iterator
//should inherit from this class
};
};
template<class T>
class MyVector : public MyCollection<T>
{
private:
vector<T> data;
public:
MyVector(int * start, int * end) : data(start, end) {}
class iterator : vector<T>::iterator
{
iterator(typename vector<T>::iterator i) : vector<T>::iterator(i) {}
};
iterator begin() { return iterator(data.begin()); }
};
template<class T>
class MyList : public MyCollection<T>
{
private:
list<T> data;
public:
Mylist(int * start, int * end) : data(start, end) {}
class iterator : list<T>::iterator
{
iterator(typename list<T>::iterator i) : list<T>::iterator(i) {}
};
iterator begin() { return iterator(data.begin()); }
};
これを行うコードをいくつか用意したいと思います。
int ints[] = {1,2,3,4,5};
MyList<int> l(ints, ints+5);
MyCollection<int> * c = &l;
MyCollection<int>::iterator i = c->begin();
MyList l
そのコードが実行された後、 usingを反復できるようにしたいと思いi
ます。
virtual begin()
にメンバー関数が必要な気がしますがMyCollection
、適切な戻り値の型がどうあるべきかわかりません。
私がやろうとしていることは可能ですか?私のコードの現在の構成が完全に間違っている可能性は十分にあります。それは私が試したことです。私の目標は、上記のサンプル ドライバー コードが機能するようにすることです。そのため、回答にはコードの完全な再構築が必要になる場合があります。私は本当に提案を探しています。完全な答えは必要ありません。