C++ の range で iterate 相当のことがしたいときの value_type

C++iterate 相当の機能を提供する range の value_type はどうすれば良いのでしょうねぇ,という思関数期特有なお悩み.
C++ の場合,関数として多相関数オブジェクトが指定できる (し,実際そういうものを指定したい) 上に,関数が ad-hoc な多相性を発揮する場合がある,つまり関数を適用するときに引数として指定されたオブジェクトが引数の型に合致するように暗黙の変換をかけるかもしれない.結果,関数の適用毎に型がころころ変わる可能性がありますけれど,一方で range の value_type としてはある一つの型に固定しなければならないわけで,これどないしまふ?みたいな.
もっとも厳密かつ汎用な形式で適切な value_type を推論しようとするならば, iteration の最初の型 T0 が与えられて,関数の適用時における引数型に対する戻り値の型の対応を一つのメタ関数 F とみなしたとき,最終的に rang の value_type として選択するべき型は, T0 を初期値としたときの F の固定点ではないでしょうかってあまりに厳密すぎて本当にどうでも良いなこれ.