関数オブジェクト〜ぱらぱらめくる『STL標準講座』

  • 『関数オブジェクトとはoperator()が定義されているクラスのこと』
  • #include でincludeする
  • 単項関数オブジェクトと二項関数オブジェクトに分類できる
  • テンプレート関数になっているからもちろん(対応する)すべてのコンテナクラスで同じように使える
  • 自作関数オブジェクトを作りたければ、以下のようにisEvenクラスを定義して、それは単項関数オブジェクトであるものとして作り、algorithmに渡してベクトルの要素に逐次適用する、というような使い方をすればよい
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

class isEven: public unary_function<int,bool> {
public:
  result_type operator() (argument_type i)
  {
    return (result_type) !(i%2);
  }
};

int main()
{
  vector<int> v;
  int i;
  for(i=1; i < 20; i++) v.push_back(i);
  i = count_if(v.vegin(), v.end(),isEven());
  return 0;
}
  • バインダは、二項関数オブジェクトの第1引数か第2引数に特定の値を結び付けて、単項関数オブジェクトのように使えるようにする仕組み
  • 否定回路はバインダの使い勝手をよくするものと言えるでしょうか。単項関数オブジェクト化したとして、ある値より大、という処理を作ったあとで、その値以下、というのは、否定回路を使って指定することができます。そうすると「読みやすい」
  • 関数ポインタ・アダプタ、メンバ関数ポインタ・アダプタ
    • おそらく、ですが、関数の使い方に慣れてくると、そのポインタ操作でやりくりしたくなるのでしょう。そのための仕組み