インターフェースの設計に悩む

// pred(*beg1, *beg2)が真である間だけbeg1をインクリメントする
template <class Iter1T, class Iter2T, class BinPredT>
inline void advance_while(Iter1T& beg1, Iter1T end1, /* ここに悩む */, BinPredT pred){
  // hogehoge
}

のような関数を今日実装したけどインターフェースにかなり悩んだ。
次の2通りが考えられるけど...

  1. void advance_while(Iter1T& beg1, Iter1T end1, Iter2T beg2, BinPredT pred)
  2. void advance_while(Iter1T& beg1, Iter1T end1, Iter2T beg2, Iter2T end2, BinPredT pred)

STLに合わせるなら普通1にするし、1の方が効率が良くできる場面は多い。
でも2の方が安全だし、私の実装ではRandom Access Iteratorの時の実装を最適化してるので2の方が自前で範囲チェックするより(たぶん)効率的になるはず。

新たな問題発生

さっきのような関数でbeg2もインクリメントしなければならない場面があった。こういうときはどうすればいいんだろ?
boost::refが解決になるかと思ったらそういう類のものじゃなかった(^^;
新しく関数用意するしかないのかな。