Listing 2: The class template iterator_to_member

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 —