2008-08-13 60 views
29

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

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

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; 
}; 

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

有没有一种优雅的方式来解决这个问题?

回答

2

优于从不迟到......

C-Vu最新一期止跌回升并猜测它里面的内容:没错,迭代器那究竟是你想要什么。

不幸的是,您需要成为ACCU的成员才能查看该杂志(该文章引用了David所链接的2000年的Overload文章)。但是,一年价格低廉,你会得到一本精美的杂志来阅读,会议和用户组。当您成为会员时,您可以查看后面问题的PDF格式,以便what are you waiting for

1

小心你要的东西。您看到的any_iterator类在一组无限的迭代器类型上工作。你只有三个,你知道前面。当然,您可能需要在将来添加第四种类型,但如果这需要O(1)多余的代码行呢?

封闭的可能包含类型的一大优点是您对sizeof()有一个上限,这意味着您可以避免堆和它带来的间接性。基本上,他们都在一个boost :: variant并调用apply_visitor。