2013-07-12 5 views
5

Ich habe einen Behälter, der für die Verwaltung einer Reihe von Attributen verantwortlich ist. Die Klasse sieht zum Teil etwas wie folgt aus:Dereferenziere Adapter für Iterator von Zeigern

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

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

Attribut ist polymorph, so haben die Attribute als Zeiger gespeichert werden sie jedoch niemals NULL sein kann.

Ich möchte mit BOOST_FOREACH diese Klasse verwenden, wie folgt aus:

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

Nach BOOST_FOREACH Dokumentation,

Die Unterstützung für STL-Container ist sehr allgemein; alles, was wie ein STL-Container aussieht, zählt. Wenn es iterator- und const_iterator-Typen und die Elementfunktionen begin() und end() verschachtelt hat, wird BOOST_FOREACH automatisch wissen, wie man darüber iteriert.

So aktualisiert ich meine Klasse so etwas wie folgt aussehen:

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; 
}; 

So, jetzt kann ich dies tun:

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

Das ist schön aber Ich mag es nicht, dass es aussetzt die Attribute als Zeiger. Auf der Anruferseite ist das Rauschen und würde sinnlose NULL-Prüfungen generieren.

Ich habe ein paar Ideen, wie das Problem zu beheben. Zum Beispiel, so etwas wie dies wäre schön:

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; 
}; 

Die ‚iterator_dereference_adapter‘ Klasse ist etwas selbsterklärend. Es würde einen vorhandenen Iterator von Zeigern umbrechen und die Zeigerwerte dereferenzieren.

So endlich meine Frage ...

Bevor ich gehe und versuchen, diesen Adapter zu schreiben, gibt es etwas in STL oder wie diese Klasse Auftrieb?

Ich bin für andere Ideen offen.

+5

-Boost einen [indirekten Iterator] hat (http://www.boost.org/doc/libs/1_54_0/libs/iterator/doc/indirect_iterator.html). –

+0

Schöne Frage. +1. –

Antwort

7

-Boost hat indirect_iterator die genau zum Einwickeln einen Iterator auf Zeigertyp des bestimmungsgemäßen und automatisch dereferenzieren.