2013-07-12 15 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はそれを反復処理する方法を自動的に知ります。

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

これはいいですが、私はそれが公開されることを好きではない:だから

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

今、私はこれを行うことができます。

は、だから私はこのような何かを見て私のクラスを更新しますポインタとしての属性呼び出し側からは、これはノイズであり、無意味な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

ブースト[間接イテレータ(http://www.boost.org/doc/libs/1_54_0/libs/iterator/doc/indirect_iterator.html)を有しています。 –

+0

良い質問です。 +1。 –

答えて

7

ブーストは、正確にポインタ型にイテレータをラップし、自動的に逆参照するためintededさindirect_iteratorを有しています。