閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

boost1.33.0

いろんなとこでとっくに述べられてますが、 boost の 1.33.0 がリリースされたみたいです。

サイトの HTML が XHTML1.0 (しかも strict) になってる。素晴らしい。

新規に追加されたライブラリはまだ見ていませんが、既存の bind に変更があった模様。 bind 関数の戻り値に対して演算子が色々使えるようになったみたいですね(Boost: bind.hpp documentation - Boost 1.49.0)。

本家サイトの例にもありましたが、今回の変更で以下のようなことができてしまうように。

struct person
{
    person(const std::string& aName) : name(aName) {}
    std::string name;
};
int main()
{
    person arr[3] = {person("sato"), person("suzuki"), person("yamada")};

    std::cout << (*(std::find_if(arr, arr + 3, boost::bind(&person::name, _1) == "suzuki"))).name << std::endl;
    return 0;
}

メンバ変数が特定の値になってるオブジェクトのみ取り出したい場合、 find_if とかを使うにしても今まではそれ用の関数オブジェクトを用意しなくてはいけなかったものが、これを使用することで不要になると。なんだか lambda っぽいですね。 bind は仕事でも使っているのでバージョンアップしようかなあ。でも、こんなの書いたらまたひかれそう……。

しかし、 find_if の第三引数って関数オブジェクトを取るはずだけれど、この書き方だと真偽値を渡してしまってエラーになるんじゃないか? と思ったけれど、 operator== で関数オブジェクト (std::equal) を返すようになってるから大丈夫、なのかな? どうもソースを理解しきれないので怪しいけれど、でもそうでないと動かないんだから、そうなんだろう (適当)。

実際には bind 関数では bind_t 型のオブジェクトを返していて、これの operator()() がその前にセットされたの述語関数を返しているようだ。よくこんなの書けるなあ……。