ファンクタ(関数オブジェクト)

functor.png

定義

演算子のオーバーロードの中でも、特に ()演算子をオーバーロードしたものを関数オブジェクト(ファンクタ)と呼びます。

用途

関数オブジェクトの典型的な用途は、より優れたコールバックを記述すること
C言語では、コールバックには関数へのポインタを使う他ないが、コールバックの内外で状態変数を共有できない。
この制限のために、関数の動的な振る舞いが制約されてしまう。以下に擬似コードで例を示す。
関数オブジェクトを使うことでFacade パターンを実装し、こうした問題を解決することができる。
STLfor_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ヘッダ

サポートサイト Wikidot.com