我试图找到一种访问一组容器的通用方法。除了另一个自定义列表外,我还有一个标准的矢量和列表。
自定义列表定义了一个迭代器;
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;
};
但显然这些都是不同类型的迭代器。我可以假设所有容器都属于同一类型。
有没有一种优雅的方法来解决这个问题?
答案 0 :(得分:19)
答案 1 :(得分:1)
迟到总比不上......
最新一期的C-Vu出现并猜测其中的内容:这是正确的,完全你想要的迭代器。
不幸的是,您需要成为ACCU的成员才能查看该杂志(该文章引用了David链接到2000年的Overload文章)。但是,对于每年一个不起眼的价格,你会得到一本很好的杂志阅读,会议和用户群。当您成为会员时,您可以查看PDF背面问题what are you waiting for?
答案 2 :(得分:1)
小心你所要求的一个案例。您看到的any_iterator类可以处理一组无限的迭代器类型。你只有三个,你事先知道。当然,您可能需要在将来添加第四种类型,但是如果需要额外的O(1)代码呢?
一组封闭的可能包含类型的一大优点是你在sizeof()上有一个上限,这意味着你可以避免堆和它带来的间接。基本上,将它们全部填入boost :: variant并调用apply_visitor。