テンプレートメンバ関数と仮想関数を (半ば強引に) 組み合わせる
追記: タイトルが不正確だと思ったので修正。
Wassr で id:kazuhooku さんがつぶやいていたので、それに触発されて。
それにしてもこの 2 つは本当に水と油だね。typeinfo 見てディスパッチする、というのがばっちりはまる場合というのも結構ありそうだけど、今回は「2 つのイテレータで表される range を受け取るテンプレート関数を仮想関数にしたい」というような状況に限定して考えてみる。
range をラップする limited_generator というインターフェイスを定義して、こいつを仮想関数の引数として渡すことを考える。
limited_generator は limited_generator::valid() メソッドが true を返す間、 limited_generator::operator()() を呼び出す度に次の値を返すものとする。
limited_generator を実装するクラスはテンプレートにして、あらゆる range をサポートできるようにする。
↓以下コード (gist)
あまり綺麗にできなかった。無念。