32

我正在尝试找到一种访问一组容器的通用方法。除了另一个自定义列表之外,我还有一个标准向量和列表。

自定义列表定义了一个迭代器;

class Iterator: public std::iterator<std::forward_iterator_tag, T> {
    // ...
}

Iterator begin() {
    return (Iterator(root));
}

Iterator end() {
    return (Iterator(NULL));
}

适当的运算符重载。

理想情况下,我想这样做;

class Foo {
public:
    Foo() {
        std::list<int> x;
        std::vector<int> y;
        custom_list<int> z;

        iter = x.begin(); // OR
        iter = y.begin(); // OR
        iter = z.begin();

        // ...
    };
private:
    std::iterator<int> iter;
};

但显然这些都是不同类型的迭代器。但是,我可以假设所有容器都是同一类型。

有没有优雅的方法来解决这个问题?

4

3 回答 3

20

这里有一些您可能会感兴趣的文章

给 STL 迭代器一个基类

C++ 迭代器的类型擦除

any_iterator 类参考

于 2008-08-13T15:47:35.707 回答
1

迟到总比不到好...

最新一期的C-Vu出现了,猜猜里面有什么:没错,迭代器可以完全按照您的意愿行事。

不幸的是,您需要成为ACCU的成员才能查看该杂志(该文章引用了 David 链接到的 2000 年的 Overload 文章)。但是,以每年微不足道的价格,您可以获得一本不错的杂志、会议和用户组。成为会员后,您可以查看 PDF 的过刊,您还在等什么?

于 2008-08-14T11:09:02.690 回答
1

小心你所要求的情况。您看到的 any_iterator 类适用于无限的迭代器类型集。你只有三个,你事先知道。当然,您将来可能需要添加第四种类型,但是如果这需要 O(1) 额外的代码行怎么办?

The big advantage of a closed set of possible contained types is that you have an upper bound on sizeof(), which means you can avoid the heap and the indirection it brings. Basically, stuff them all in a boost::variant and call apply_visitor.

于 2008-09-24T15:44:41.220 回答