テンプレートメンバ関数と仮想関数を (半ば強引に) 組み合わせる

追記: タイトルが不正確だと思ったので修正。

Wassrid:kazuhooku さんがつぶやいていたので、それに触発されて。

それにしてもこの 2 つは本当に水と油だね。typeinfo 見てディスパッチする、というのがばっちりはまる場合というのも結構ありそうだけど、今回は「2 つのイテレータで表される range を受け取るテンプレート関数を仮想関数にしたい」というような状況に限定して考えてみる。

range をラップする limited_generator というインターフェイスを定義して、こいつを仮想関数の引数として渡すことを考える。

limited_generator は limited_generator::valid() メソッドが true を返す間、 limited_generator::operator()() を呼び出す度に次の値を返すものとする。

limited_generator を実装するクラスはテンプレートにして、あらゆる range をサポートできるようにする。

↓以下コード (gist)

あまり綺麗にできなかった。無念。