1

私はラッパー クラスを独自のイテレータと共に記述して、それらのクラスとそのイテレータの両方のスーパークラスを記述できるようにしようとしstd::liststd::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、適切な戻り値の型がどうあるべきかわかりません。

私がやろうとしていることは可能ですか?私のコードの現在の構成が完全に間違っている可能性は十分にあります。それは私が試したことです。私の目標は、上記のサンプル ドライバー コードが機能するようにすることです。そのため、回答にはコードの完全な再構築が必要になる場合があります。私は本当に提案を探しています。完全な答えは必要ありません。

4

2 に答える 2

0

MyCollection::beginMyCollection::iterator慣例により、を返す必要があります。したがって、少なくともaもMyVector::begin()返す必要があります。ただし、より派生したタイプである可能性があります。MyCollection::iterator

あなたの場合、はから派生していない をMyVector::begin()返します。それが失敗する理由です。MyVector::iteratorMyCollection::iterator

于 2013-03-26T13:17:48.457 に答える
0

この場合、std::list または std::vector を均一に使用するという唯一の目的のためにstd::vector、ラッパーを作成しません。std::listその必要はありません。あなたが望むのは、ここにあるものと同様の方法で型消去を使用することです

あなたにとっての全体的なアイデアは、タイプが消去されたイテレータでのみ実装MyCollection<T>し、コレクションのいずれかをトラバースするためにタイプが消去されたイテレータを使用することです。MyList<T>またはは必要ありませんMyVector<T>

于 2013-03-26T13:01:35.163 に答える