2013-07-12 40 views
5

我有一個容器負責管理一組屬性。該類部分看起來像這樣:指針迭代器的解引用適配器

class AttributeSet 
{ 
public: 
    // ... interface is irrelevant for my question. 

private: 
    std::vector<boost::shared_ptr<Attribute> > m_attributes; 
}; 

屬性是多態的,所以屬性必須存儲爲指針,但它們不能爲NULL。

我想使用這個類BOOST_FOREACH,就像這樣:

BOOST_FOREACH(const Attribute &attribute, attributeSet) 
{ 
    ... 
} 

據BOOST_FOREACH文檔,

對STL容器的支持是很一般;任何看起來像STL容器的東西都是重要的。如果它具有嵌套的iterator和const_iterator類型以及begin()和end()成員函數,BOOST_FOREACH將自動知道如何遍歷它。

所以我更新了我的班是這個樣子:

class AttributeSet 
{ 
public: 
    typedef std::vector<boost::shared_ptr<Attribute> > container; 
    typedef container::iterator iterator; 
    typedef container::const_iterator const_iterator; 

    iterator begin(); 
    iterator end(); 

    const_iterator begin() const; 
    const_iterator end() const; 

private: 
    container m_attributes; 
}; 

所以,現在我可以這樣做:

BOOST_FOREACH(const boost::shared_ptr<Attribute> &attribute, attributeSet) 
{ 
    ... 
} 

這是不錯的,但是我不喜歡它公開屬性作爲指針。從來電方來說,這是噪音,會產生毫無意義的NULL檢查。

我對如何糾正問題有幾點想法。例如,這樣的事情會很好:

class AttributeSet 
{ 
public: 
    typedef std::vector<boost::shared_ptr<Attribute> > container; 
    typedef iterator_dereference_adapter<container::iterator> iterator; 
    typedef iterator_dereference_adapter<container::const_iterator> const_iterator; 

    iterator begin() { return iterator(m_attributes.begin()); } 
    iterator end() { return iterator(m_attributes.end()); } 

    const_iterator begin() const { return const_iterator(m_attributes.begin()); } 
    const_iterator end() const { return const_iterator(m_attributes.end()); } 

private: 
    container m_attributes; 
}; 

'iterator_dereference_adapter'類有點不言自明。它會包裝現有的指針迭代器並取消指針值。

所以最後,我的問題 ...

之前,我走下車,並嘗試寫這個適配器,是有什麼在STL或升壓像這樣的課嗎?

我接受其他想法。

+5

Boost有一個[間接迭代器](http://www.boost.org/doc/libs/1_54_0/libs/iterator/doc/indirect_iterator.html)。 –

+0

不錯的問題。 +1。 – 2013-07-12 18:10:20

回答