アルゴリズムディスパッチ2010/04/21 06:00

VisualStudio2010を楽しみに待っていたのに、なかなか、公開されないので、C++ で初めて知ったことを書いてみようと思います。

雲は、STLは昔から使っているのですが、STLの詳細はあまり調べたことがありません(正確には、挫折しているといった方が良いかも)。とはいえ、何回目かのチャレンジでやっと、iterator_category の意味がわかりました。

なんで、iterator_category などを調べる気になったのかはよくわかっていませんが(←どういうこと)、いろいろと、調べているうちにきっとたどりついたのでしょう???

さて、アルゴリズムディスパッチですが、要するに、iterator の特性を表す構造体 iterator_traits の中のメンバーです。このメンバーの目的は、結局、コンパイル時に最適な関数を呼び出すために使われるというのがミソでした。

例えば、 void goo( input_iterator_tag ) {

}

template<typename Iterator> void foo( Iterator p ) {

  goo( iterator_traits<Iterator>::iterator_category );

}

のようにしておくと、foo の引数である Iterator のタイプによってgooを呼び出しを切り替えられる(つまり、input_iterator_tag を引数に持つ関数とか、output_iterator を引数に持つ関数を呼び分けられる)。ということがポイントです。

これで、数年来の謎がちょっとは解けてちょっと嬉しい雲でした。