Dereference adapter for iterator of pointers
adapter, boost, c++, iterator, stl
Solution
Boost has indirect_iterator which is exactly inteded for wrapping an iterator to pointer type and automatically dereferencing.
Problem
I have a container which is responsible for managing a set of attributes. The class partially looks something like this: ``` class AttributeSet { public: // ... interface is irrelevant for my question. private: std::vector<boost::shared_ptr<Attribute> > m_attributes; }; ``` Attribute is polymorphic so the attributes have to be stored as pointers however they can never be NULL. I want to use this class with BOOST_FOREACH, like this: ``` BOOST_FOREACH(const Attribute &attribute, attributeSet) { ... } ``` According to BOOST_FOREACH documentation, The support for STL containers is very general; anything that looks like an STL container counts. If it has nested iterator and const_iterator types and begin() and end() member functions, BOOST_FOREACH will automatically know how to iterate over it. So I updated my class to look something like this: ``` 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 now I can do this: ``` BOOST_FOREACH(const boost::shared_ptr<Attribute> &attribute, attributeSet) { ... } ``` This is nice however I don't like that it exposes the attributes as pointers. From the caller side, this is noise and would generate pointless NULL checks. I have a few ideas on how to correct the problem. For example, something like this would be nice: ``` 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; }; ``` The 'iterator_dereference_adapter' class is somewhat self-explanatory. It would wrap an existing iterator of pointers and dereference the pointer values. So finally, my question... Before I go off and try to write this adapter, is there something in STL or Boost like this class? I'm open to other ideas.