2014-10-16 40 views
0

我正在實現一個迭代器,以便與我編寫的類一起使用。我想要的行爲與除構造函數外的std::vector::const_iterator一樣,遞增和遞減,即迭代器是(不可變的,即不是OutputIterator的示例)RandomAccessIterator在C++中創建迭代器時派生行爲的基類11

我真的不想定義迭代器上的所有操作,它們與它使用的std::vector::const_iterator相同。我寧願從一個已經具有所有這些行爲的類派生出來,但由於std::vector::const_iterator沒有虛擬析構函數,並且通過繼承派生將允許轉換回std::vector::const_iterator,所以不適合僅僅讓我的迭代器從它繼承。

有定義(在理想情況下,標準庫)的模板需要RandomAccessIterator作爲模板參數,並通過調用他們,是一個私有成員對所有一RandomAccessIterator需要有操作提供虛成員函數傳遞給構造函數(即它通過構造而不是繼承從它的模板參數派生出所有的RandomAccessIterator操作)?

爲了澄清,我希望能夠寫類似

template<class value_type> 
class myIterator : public random_access_iterator<std::vector<value_type>::const_iterator> 
{ 
    myIterator(..., std::vector<value_type>::const_iterator base_iterator) 
     : random_access_iterator(base_iterator) { ... } 
    myIterator& operator++() derived; 
    myIterator& operator++ (int) derived; 
    myIterator& operator--() derived; 
    myIterator& operator-- (int) derived; 
    myIterator(const myIterator&) = default; 
    myIterator(myIterator&&) = default; 
    myIterator& operator=(const myIterator&) = default; 
    myIterator& operator=(myIterator&&) = default; 
}; 

但是,還是,我不知道在這個例子中random_access_iterator模板存在如果是這樣,它叫什麼。

+4

也許像boost的'iterator_facade'? – zmb 2014-10-16 17:44:19

+1

看看Boost [iterator_adaptor](http://www.boost.org/doc/libs/1_56_0/libs/iterator/doc/iterator_adaptor.html)。 – Casey 2014-10-16 18:33:18

回答

1

標準中沒有這樣的模板。

boost有幾個幫助製作迭代器。

通常情況下,您應該至少實施一次自己的迭代器,然後將其拋出並儘可能使用boost解決方案。

boostiterator_fascade使用CRTP從派生和基本類型中提取行爲,併爲您做了一堆樣板工作。如果您要修改現有的迭代器,iterator_adaptor可能會很有用。

在依靠boost實現之前編寫一個基本的CRTP迭代器幫助器是一個好主意,因爲它具有教育意義。

+0

謝謝。標準庫中沒有一個已經是一種遺憾了。在這種情況下,我寧願不使用增強功能,僅僅因爲它增加了更多的麻煩,因爲現在實際上只是一個小程序,所以我會寫我自己的,至少現在使用(但是,如果應用程序擴展並依賴於其他地方使用boost,或者在其他地方有一個不平凡的依賴項,我將用boost iterator_adapter替換它,並且一般來說,除非有充分的理由,否則我將在未來使用它至)。 – TSip 2014-10-17 11:02:36

相關問題