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 lusing i

我觉得需要有一个virtual begin()成员函数MyCollection,但我无法弄清楚正确的返回类型应该是什么。

我想要做的甚至可能吗?我的代码的当前组织完全有可能是完全错误的。这就是我尝试过的。我的目标只是得到它,以便上面的示例驱动程序代码可以工作,因此答案可能涉及代码的完全重组。我真的只是在寻找建议。我不需要完整的答案。

4

2 回答 2

0

std::vector在这种情况下,我不会为std::list统一使用 std::list 或 std::vector 编写包装器。你不需要。您想要的是以与您可以在此处找到的类似的方式使用类型擦除。

您的整个想法是仅MyCollection<T>使用类型擦除迭代器来实现,并使用类型擦除迭代器来遍历任何集合。不需要MyList<T>or MyVector<T>

于 2013-03-26T13:01:35.163 回答
0

MyCollection::begin按照惯例,应该返回 a MyCollection::iterator。因此MyVector::begin()也应该返回至少是 a的东西MyCollection::iterator。不过,它可能是更派生的类型。

在您的情况下,MyVector::begin()返回 a MyVector::iterator,它不是从MyCollection::iterator. 这就是它失败的原因。

于 2013-03-26T13:17:48.457 回答