>>122の続き
実際に使ってみる具体例として面倒なので>>112をそのまま使うと
struct Range<T> {
 start: T,
 end: T,
}
このあたりはそのまま使うとして
fn range<T>(start: T, end: T) -> Range<T> {
 Range { start, end }
}
実装部分ではジェネリックT型にOneやAddなどを求められていたのを
CloneとIntegerCompatible要求だけに変えて整数型IにOneやAddなどを移動
impl<T, I> Iterator for Range<T> where
 T: Clone + IntegerCompatible<Integer=I>,
 I: Copy + PartialOrd + num::One + std::ops::Add<Output=I>, {
 type Item = T;
 fn next(&mut self) -> Option<T> {
  if T::into_integer(&self.start) < T::into_integer(&self.end) {
    let result = self.start.clone();
    self.start = T::from_integer(T::into_integer(&self.start) + I::one());
    Some(result)
 } else {
    None
  }
 }
}
今はコンパイラ支援がないので手動変換ですが自動もしくは簡便な記法に出来そう
あと整数型にはいちいちOneやAddやPartialOrdを書かなくても済むように出来そう