ファイルを一行ずつ読む

結論から。

ifstream f(file_name);
BOOST_FOREACH(string const& line, make_istream_line_iterator_range(f))
{
  //処理...
}

C++でファイルを一行ずつ読む方法を検索すると、大抵はifstreamとstd::getlineとwhileを使ったものが出てくる。自分もずっとそうやってきた。とはいえ、どう考えてもBOOST_FOREACHを使って上記のようにできるはず、ともずっと思ってきた。誰かがとっくにやってるはずと、調べてみたが出てこない。*1
BOOST_FOREACHが扱うのはレンジであり、レンジはイテレータで作る。レンジが見つからない場合はイテレータを探すことになる。istream_line_iteratorが2つ見つかった。ひとつはboost/test/utils/iterator/istream_line_iterator.hpp、もうひとつはhamigaki/iterator/istream_line_iterator.hpp。特にどっちがどうというわけではないが、boostのほうはBoost.Testが正式に公開というか仕様に含んでいるようなものでもなさそうなので、hamigakiのほうを選択。
make_istream_line_iteratorみたいなヘルパー関数は無いみたいなので、適当に書いて、おしまい。

*1:2008-02-24 追記: pstade/oven/stream_lines.hppがありました