2011-02-22 53 views
5

是否有可能使用boost迭代器外观实现任何迭代器? 我不希望在我的基类来定义实施细则AnyIterator和boost迭代器外观

class Base 
{ 
public: 
typedef std::vector<int>::iterator iterator;//implementation detail 
... 
virtual iterator begin()=0; 
virtual iterator end()=0; 
}; 

还是我必须从头开始完全写一个;

+0

的方式,我可能会做它是定义像`迭代器`这就像一个Java或C#迭代器的抽象基类,模板化的实现,对于任意的迭代器,然后用Boost.Iterator包一个迭代器接口在任何`Iterator `之上。你想让我试图勾画伪代码吗? – 2011-02-22 17:13:23

回答

9

您发布的代码已修复从Base返回的迭代器类型及其所有实现代码为std::vector<int>::iterator,这可能不是您想要的。耶利米的建议是去与一个缺点的一种方式:你有STL宽松的兼容性......我知道的多态迭代器包装的三种实现的:

  1. 贝克尔的any_iterator(实现boost::iterator_facade
  2. opaque_iterator库(谷歌为它),或
  3. Adob​​e的非常有趣的多库包含符合any_iterator s STL层次结构。

的问题是难度比它看起来......我做了一个尝试自己主要是因为我需要协方差any_iterators类型参数(any_iterator<Derived>应该是自动转换为any_iterator<Base>),这是很难与像迭代器STL简洁地实现。像Enumerator<T>这样的C#更容易实现(*)(并且imho通常比STL类似的迭代器对更清洁),但是再次,您“松开”了STL。

(*)=当然没有 '产量' :-)

3

我想这可能是你在找什么:

any_iterator: Type Erasure for C++ Iterators

下面是一个片段该页::

概述

类模板any_iterator是对迭代器 迭代器的boost :: function的模拟。它允许你有一个变量,并为其分配不同类型的迭代器,只要这些迭代器具有合适的通用性。