使用c ++中的迭代器在stl类周围编写包装器

时间:2013-03-18 17:42:37

标签: c++ templates stl iterator

我正在尝试使用自己的迭代器在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遍历i

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

我正在尝试做甚么可能吗?我的代码的当前组织完全可能是完全错误的。这就是我尝试过的。我的目标只是为了使上面的示例驱动程序代码可以工作,所以答案可能涉及代码的完全重组。我真的只是在寻找建议。我不需要完整的答案。

2 个答案:

答案 0 :(得分:0)

在这种情况下,我不会为std::vectorstd::list编写一个包装器,其唯一目的是统一使用std :: list或std :: vector。你不需要。 你想要的是以类似于here的方式使用类型擦除。

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

答案 1 :(得分:0)

按惯例,

MyCollection::begin应该返回MyCollection::iterator。因此,MyVector::begin()也应该返回至少 a MyCollection::iterator的内容。不过,它可能是一种派生类型。

在您的情况下,MyVector::begin()会返回MyVector::iterator,该MyCollection::iterator不是来自{{1}}。这就是它失败的原因。