2006-06-21 [長年日記]

[C++] boost::bindとmake_adaptable

std::not1などをboost::bindと組み合わせる場合には、bindで作られた関数オブジェクトの返り値の型を明示するためにmake_adaptableが必要です。

つまり、

std::find_if(v.begin(), v.end(),
  std::not1(boost::bind(std::equal_to<int>(), _1, 5)));

だとコンパイルエラーになるので、

std::find_if(v.begin(), v.end(),
  std::not1(boost::make_adaptable<bool, int>(
    boost::bind(std::equal_to<int>(), _1, 5))));

にしなくてはいけないということです*1。しかし、よく考えるとbindする前の関数を反転した方が手っ取り早いですね。

std::find_if(v.begin(), v.end(),
  boost::bind(std::not2(std::equal_to<int>()), _1, 5));

*1  そもそも上の例だと単にstd::findを使えばいいのですが

[]