2008-04-08

Boost.Range

Boost.Rangeは結構いろんなところで使われているけれど、ドキュメントが分かりにくいのではないか。

仕組みはとても簡単で、その思想は、「イテレータを扱うときに、二つの変数を使うのがうっとしいから、ひとつにまとめましょう」ということだ。iterator_rangeクラスは、外から見ると、まるでSTLのコンテナのように振舞う。例えばbeginやendというおなじみの関数があるし、イテレータの種類の違いによって、例えばランダムアクセスイテレータならば、operator []関数も用意されている。だから、STLのコンテナのように使ってよい。(イテレータ部分のみだけ)

とはいえ、既存のC++のコードとも共存したい。そこで、boost::beginやboost::endのような関数も用意されている。

まあともかく、使ってみようと、既存のコードをRangeで書き直そうとしたが、どこかを書き間違えたらしく、コンパイルが通らない。しかもエラーは、このおれの書いたコードのおかしい箇所ではなく、boost/range以下のヘッダファイルを指し示すのだから、さっぱりわからない。
方法を変える事にした。イテレータを使っているコードを人間が修正しようとするから、ミスが起こるのだ。既存のイテレータを使っているコードは完璧に動くのだから、ラッパでも用意してやればいい。ということで、既存のイテレータのコードへのRangeのラッパを用意して、実際の処理は既存のコードに丸投げしてみた。うまく動いた。

実際、Rangeとイテレータで同じ実装を二度書くのも馬鹿馬鹿しいし、やはりこういうのが一番いいのかな。便利だし。

No comments: