template<
typename _It, // type of original iterator
typename _T, // type pointed to by original iterator
typename _R // type of the member we want to point to
>
class iterator_to_member
{
public:
// Some typedefs
//
typedef typename std::iterator_traits<_It>::iterator_category
iterator_category;
typedef typename std::iterator_traits<_It>::difference_type
difference_type;
typedef _R value_type;
typedef _R* pointer;
typedef _R& reference;
// Construction from an iterator and a pointer to member.
iterator_to_member(_It from, _R _T::* memptr) :
m_it(from), m_memptr(memptr){}
// Operators *, ->, and [] are first forwarded to the contained
// iterator, then extract the data member.
reference operator*() const;
pointer operator->() const;
reference operator[](difference_type n) const;
// All operators that have to do with position are forwarded
// to the contained iterator.
iterator_to_member& operator++();
iterator_to_member operator++(int);
iterator_to_member& operator--();
iterator_to_member operator--(int);
iterator_to_member& operator+=(difference_type n);
iterator_to_member operator+(difference_type n) const;
iterator_to_member& operator-=(difference_type n);
iterator_to_member operator-(difference_type n) const;
bool operator==(const iterator_to_member<_It, _T, _R>& rhs) const
{ return m_it == rhs.m_it; }
bool operator!=(const iterator_to_member<_It, _T, _R>& rhs) const
{ return m_it != rhs.m_it; }
_It m_it;
protected:
value_type _T::* m_memptr;
};
template<typename _It, typename _T, typename _R>
inline iterator_to_member<_It, _T, _R>::reference
iterator_to_member<_It, _T, _R>::operator*() const
{ return (*m_it).*m_memptr; }
template<typename _It, typename _T, typename _R>
inline iterator_to_member<_It, _T, _R>::pointer
iterator_to_member<_It, _T, _R>::operator->() const
{ return &((*m_it).*m_memptr); }
template<typename _It, typename _T, typename _R>
inline iterator_to_member<_It, _T, _R>::reference
iterator_to_member<_It, _T, _R>::operator[](difference_type n) const
{ return m_it[n].*m_memptr; }
template<typename _It, typename _T, typename _R>
inline iterator_to_member<_It, _T, _R>&
iterator_to_member<_It, _T, _R>::operator++()
{ ++m_it; return *this; }
// All other operators having to do with position are
// implemented in analogy to operator++().
// Make function for convenient construction.
template<typename _It, typename _T, typename _R>
iterator_to_member<_It, _T, _R>
make_iterator_to_member(_It it, _R _T::* memptr)
{ return iterator_to_member<_It, _T, _R>(it, memptr); }
End of Listing