関数オブジェクト (ファンクター) は、operator()
を実装する任意の型です。 この演算子は 呼び出し演算子 と呼ばれます。 適用演算子と呼ばれることもあります。 C++ 標準ライブラリで、関数オブジェクトは、主にコンテナーの並べ替え条件として、およびアルゴリズム内で使用されます。
関数オブジェクトは、通常の関数呼び出しよりも 2 つの主な利点を提供します。 1 つ目に、関数オブジェクトには状態を含めることができます。 2 つ目に、関数オブジェクトは型であるため、テンプレート パラメーターとして使用できます。
関数オブジェクトの作成
関数オブジェクトを作成するには、型を作成し、次のような operator()
を実装します。
class LessThanFunctor
{
public:
bool operator()(int a, int b)
{
return a < b;
}
};
int main()
{
LessThanFunctor less_than;
int a = 5;
int b = 7;
bool ans = less_than(a, b);
}
main
関数の最後の行は関数オブジェクトを呼び出す方法を示しています。 この呼び出しは関数の呼び出しのように見えますが、実際にはLessThanFunctor
型のoperator()
を呼び出しています。 関数オブジェクト呼び出しと関数の呼び出しが類似しているため、関数オブジェクトという用語が生じました。
関数オブジェクトとコンテナー
C++ 標準ライブラリでは、<functional>
ヘッダー ファイルにいくつかの関数オブジェクトが含まれています。 これらの関数オブジェクトの用途の 1 つに、コンテナーの並べ替え条件としての使用があります。 たとえば、 set
コンテナーは次のように宣言されます。
template <class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>>
class set;
2 番目のテンプレート引数は、関数オブジェクト less
です。 この関数オブジェクトは、最初のパラメーターが 2 番目のパラメーターよりも小さい場合、true
を返します。 一部のコンテナーは要素を並べ替えるので、コンテナーには 2 つの要素を比較する方法が必要です。 比較は、関数オブジェクトを使用して行われます。 関数オブジェクトを作成し、それをコンテナーのテンプレート リストに指定すると、独自の並べ替え条件を定義できます。
関数オブジェクトとアルゴリズム
関数オブジェクトのもう 1 つの用途はアルゴリズムです。 たとえば、 remove_if
アルゴリズムは次のように宣言されます。
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
remove_if
への最後の引数は、ブール値 ( 述語) を返す関数オブジェクトです。 関数オブジェクトの結果が true
場合、要素は、 remove_if
によって返される新しい末尾を超える位置にシフトされます。 引数 <functional>
には、pred
ヘッダー内で宣言したいずれかの関数オブジェクトを使用するか、独自の関数オブジェクトを作成できます。