2011-02-22 26 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的模擬。它允許你有一個變量,併爲其分配不同類型的迭代器,只要這些迭代器具有合適的通用性。