anchor.diff:  <%0.upto(GENERATION_LIMIT) {|i|%>
   <%0.upto(i) {|j|%>
   template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>>
  -struct const_tuple_type<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : const_tuple_element<A<%=j%>> {
  -	const_tuple_type(const tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>& x) : const_tuple_element<A<%=j%>>(x.a<%=j%>) {}
  +struct const_tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> {
  +	const_tuple_element(const tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>& x) : _x(x.a<%=j%>) {}
  +	typename tuple_type<A<%=j%>>::const_reference get() const { return _x; }
  +private:
  +	typename tuple_type<A<%=j%>>::const_reference _x;
   };
   <%}%>
   <%}%>
  
positive.code: 
  <%0.upto(GENERATION_LIMIT) {|i|%>
  template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
  tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_tuple(const A0& a0<%1.upto(i) {|j|%>, const A<%=j%>& a<%=j%><%}%>)
  {
  	return tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>);
  }
  
negative.code: struct tuple;
  
  template <typename Tuple, int N>
  struct tuple_element;
  
  template <typename Tuple, int N>
  struct const_tuple_element;
  
  template <typename T>
  struct tuple_type {
  	typedef T type;
  	typedef T value_type;
  	typedef T& reference;
  	typedef const T& const_reference;
  	typedef const T& transparent_reference;
  };
  
  template <typename T>
  struct tuple_type<T&> {
  	typedef T type;
  	typedef T& value_type;
  	typedef T& reference;
  	typedef const T& const_reference;
  	typedef T& transparent_reference;
  };
  
  template <typename T>
  struct tuple_type<const T&> {
  	typedef T type;
  	typedef T& value_type;
  	typedef T& reference;
  	typedef const T& const_reference;
  	typedef const T& transparent_reference;
  };
  
  
  <%0.upto(GENERATION_LIMIT) {|i|%>
  <%0.upto(i) {|j|%>
  template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>>
  struct tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> {
  	tuple_element(tuple<A0<%1.upto(i) {|k|%>, A<%=k%> <%}%>>& x) : _x(x.a<%=j%>) {}
  	typename tuple_type<A<%=j%>>::reference get() { return _x; }
  	typename tuple_type<A<%=j%>>::const_reference get() const { return _x; }
  private:
  	typename tuple_type<A<%=j%>>::reference _x;
  };
  <%}%>
  <%}%>
  