ファンクタ(関数オブジェクト)
最終更新日27 Sep 2013 15:27
定義
演算子のオーバーロードの中でも、特に ()演算子をオーバーロードしたものを関数オブジェクト(ファンクタ)と呼びます。
用途
関数オブジェクトの典型的な用途は、より優れたコールバックを記述すること
C言語では、コールバックには関数へのポインタを使う他ないが、コールバックの内外で状態変数を共有できない。
この制限のために、関数の動的な振る舞いが制約されてしまう。以下に擬似コードで例を示す。
関数オブジェクトを使うことでFacade パターンを実装し、こうした問題を解決することができる。
STLのfor_each関数を使うときに使うらしい。
#include <stdio.h> #include <vector> #include <algorithm> #include <iostream> class COutput { public: // 関数オブジェクト void operator()(int num); }; // 関数オブジェクトの定義 void COutput::operator()(int num) { std::cout << num << std::endl; // 引数の値を出力するだけ } int main() { // 配列を準備する std::vector<int> nums; for(int i = 0; i < 5; ++i ) { nums.push_back( i ); } // 配列の先頭から末尾までの各要素について COutput() を呼び出す std::for_each( nums.begin(), nums.end(), COutput() ); return 0; }
stlのfunctionalヘッダ