関数オブジェクト
Function オブジェクト、または ファンクタ、演算子を実装する型です。 この演算子は、呼び出しの演算子 または作成した アプリケーション演算子と呼ばれます。 標準テンプレート ライブラリはコンテナーに合わせてアルゴリズムで条件を並べ替えるとして関数オブジェクトを主に使用します。
Function オブジェクトは純粋な関数呼び出し上の 2 種類の主要な利点があります。 1 番目の関数オブジェクトの状態を含めることができます。 2 番目の関数は、オブジェクトの型のテンプレート パラメーターとして使用できることです。
関数オブジェクトの作成
関数オブジェクトを作成するには、型を作成し、operator()をなどの実装してする:
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 関数の最後の行は、Function オブジェクトを呼び出すかを示します。 この呼び出しは、関数呼び出しのように見えますが、実際にはファンクタの型の operator() を呼び出します。 関数オブジェクトと関数を呼び出すことでのこの部分は、用語の関数オブジェクトがどのように発生した場合です。
関数オブジェクトとコンテナー
標準テンプレート ライブラリは <functional> ヘッダー ファイルで複数の関数オブジェクトが含まれます。 これらの関数は、オブジェクトの 1 種類の使用はコンテナーの並べ替える基準として存在します。 たとえば、set コンテナーは次のように宣言されます。:
template <
class Key,
class Traits=less<Key>,
class Allocator=allocator<Key> >
class set
2 番目のテンプレート引数は、Function オブジェクト lessです。 この関数オブジェクトは渡された最初のパラメーターがで渡される第 2 パラメーター未満 true を返します。 あるコンテナー要素から、コンテナーのニーズを 2 個の要素を比較する方法並べ替えれば、関数オブジェクトを使用して実現できます。 関数オブジェクトを作成し、コンテナーのテンプレートの一覧で指定して、コンテナーの独自の並べ替える条件を定義できます。
関数オブジェクトおよびアルゴリズム
機能オブジェクトのもう一つの使用はアルゴリズムにあります。 たとえば、remove_if アルゴリズムは、次のように宣言されます。:
template<class ForwardIterator, class Predicate>
ForwardIterator remove_if(
ForwardIterator _First,
ForwardIterator _Last,
Predicate _Pred
);
remove_if への最後の引数が関数オブジェクト返すブール値 (述語) です。 関数オブジェクトの結果が trueの場合、要素は、反復子 _First と _Lastによってアクセスされるコンテナーから削除されます。 引数 _Pred に <functional> のヘッダーで宣言された関数オブジェクトを使用したり、独自に作成することもできます。