Example 6: A naive attempt at Type Fixing.

template <typename C>
class sequence_range
{
public:
  enum { C_HAS_MUTABLE_INTERFACE = has_iterator_type<C>::value &&
                                   has_pointer_type<C>::value };
  typedef typename select_first_type< typename C::reference
                                    , typename C::const_reference
                                    , C_HAS_MUTABLE_INTERFACE
                                    >::type             reference;
  typedef typename C::const_reference   const_reference;
  ...