Listing 3

template <typename C>
class sequence_range
{
private:
  enum { C_HAS_MUTABLE_INTERFACE = has_iterator_type<C>::value &&
                                   has_pointer_type<C>::value };
  typedef typename typefixer_reference< C
                                      , C_HAS_MUTABLE_INTERFACE
                                      >::reference      
			       putative_reference;
  typedef typename typefixer_iterator< C
                                      , C_HAS_MUTABLE_INTERFACE
                                      >::iterator       
			       putative_iterator;
public:
  typedef typename C::const_reference                   
			     const_reference;
  typedef typename select_first_type< putative_reference
                                    , const_reference
                                    , C_HAS_MUTABLE_INTERFACE
                                    >::type             reference;
  typedef typename C::const_iterator                    
		               const_iterator;
  typedef typename select_first_type< putative_iterator
                                    , const_iterator
                                    , C_HAS_MUTABLE_INTERFACE
                                    >::type             iterator;
  . . .
  reference current() 
  {
    return *m_current; // This now works for mutable and immutable coll
  }
  const_reference current() const
  {
    return *m_current;
  }
  . . . // Remainder of class as shown before