Functorの解説

第C7回  functorは函数合成の夢を見るか(何のこっちゃ^^;) 00/09/27
http://www.sun-inet.or.jp/~yaneurao/rsp/rspC1toC8.html

ファンクタがよくわからぬ
http://d.hatena.ne.jp/niso1985/20081004/1223126269


Functorがよく判らない。断片的に判ったのは

class compare_class {
  public:
  bool operator()(int A, int B) {
    return (A < B);
  }
};

まず、operator()のオーバーロードしてなにか処理をclassとして宣言しておく
これをFunctorと呼ぶ。関数オブジェクトと呼ぶらしい。
JavaScriptの無名関数みたいなものかもしれない。


演算子オーバーロードの理解が怪しいのでぐぐる
http://www.geocities.jp/ky_webid/cpp/language/017.html

// +演算子オーバーロード
CPoint CPoint::operator+(CPoint& obj)
{
	CPoint tmp;
	tmp.m_x = m_x + obj.m_x;
	tmp.m_y = m_y + obj.m_y;
	return tmp;
}

operatorの後ろの+に対してインタフェースがオーバーロードされる
ということは、関数オブジェクトでは
()じたいがオーバーロードされるわけか。なんじゃそりゃ! ()は演算子だったのか?
()は関数を呼び出す演算子だったのか! (たまげた)
ということは()をoverloadすると、関数呼び出しはすべて置き換わるわけか?

int main() {
    int items[] = {4, 3, 1, 2};
    compare_class functor;
    sort_ints(items, sizeof(items)/sizeof(int), functor);
}

呼ぶほうは、定義しているFunctorを宣言して、sort用の比較関数として呼び出してやると
普通なら関数のポインタ渡しで、functorの中身で、実行されるはずが、
functorが関数オブジェクトなので、inline展開されて、その場で動いてしまう(らしい)
という気がしてきた。
functorは()をオーバーロードしてしまっているので、functorを呼ぶと関数オブジェクトが起動するのはわかるけど、
なぜその前の引数が渡るのか?
1+2は、1というオブジェクトに2を引数に+というメソッドを呼び出すけれど、

sort_ints(items, sizeof(items)/sizeof(int), functor);
は?functorの()演算子がoverloadされているので、判らん。頭がうになってきた。


operator()の部分はテンポラリのオブジェクトのコンストラクタが生成されるらしい

    CObject( ).func( ); // CObjectのテンポラリオブジェクトを作り、そのメンバ関数funcを呼び出す。
と同様、functorのテンポラリオブジェクトを作るためにコンストラクタを呼び出しているのです。ここで面白いのは、
このように行なったfunctorの合成は、インライン展開される

やねうらおさんの記事で、こう解説してあった。


これは実際に動かしてみないと判らない。debugモードは関数呼び出して、releseモードはinline展開されるらしい
かなり難解で100回読んでも判らない気がしますが、このへんが判ると仕事にも活かせるので一石二鳥