Share via


関数オブジェクト

関数オブジェクト または ファンクタは 型が演算子の実装です。この演算子は 演算子の 場合 アプリケーションの演算子 と呼びます。標準テンプレート ライブラリはコンテナーのおよびアルゴリズムの並べ替え基準として関数オブジェクトを主に使用します。

関数オブジェクトは純粋な関数呼び出しに対して 2 種類の主要な利点があります。1 番目の関数オブジェクトの状態を含めることができます。2 番目の関数オブジェクトの型はテンプレート パラメーターとして使用できることです。

関数オブジェクトの作成

関数オブジェクトを作成するにはを作成し演算子 ()次のように実行します :

class Functor
{
public:
    int operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    Functor f;
    int a = 5;
    int b = 7;
    int ans = f(a, b);
}

main の関数の最終行は関数オブジェクトに呼び出すかを示します。この呼び出しは関数の呼び出しのように見えますが実際にはファンクタの種類の演算子 () を呼び出しています。関数オブジェクト関数の呼び出しとの類似点はこの用語の関数オブジェクトで発生したかです。

関数オブジェクトとコンテナー

標準テンプレート ライブラリは <functional> のヘッダー ファイルに複数の関数オブジェクトが含まれます。これらの関数オブジェクトの 1 種類の使用はコンテナーの並べ替え基準としています。たとえばset コンテナーは次のように宣言されています :

template <
    class Key,
    class Traits=less<Key>,
    class Allocator=allocator<Key> >
class set

2 番目のテンプレート引数は関数オブジェクト less です。この関数はtrueオブジェクトに渡される最初のパラメーターが渡される第 2 パラメーター未満の場合にを返します。あるコンテナーは要素コンテナーのニーズを 2 要素を比較する方法並べ替える場合この関数はオブジェクトを使用して行われます。関数オブジェクトを作成しコンテナーにテンプレートの一覧で指定することでコンテナーの独自の並べ替え基準を定義できます。

関数オブジェクトおよびアルゴリズム

オブジェクトのもう一つの機能はアルゴリズムで使用できます。たとえばremove_if アルゴリズムは次のように宣言されています :

template<class ForwardIterator, class Predicate>
    ForwardIterator remove_if(
        ForwardIterator _First,
        ForwardIterator _Last,
        Predicate _Pred
    );

remove_if への最後の引数は関数オブジェクトは 述語 がブール型 () です。関数の結果 true オブジェクトがの場合要素は反復子 _First としてアクセス _Last コンテナーから削除されます。引数 _Pred に <functional> のヘッダーで宣言された関数のオブジェクト使用するか独自に作成することもできます。

参照

関連項目

標準テンプレート ライブラリ