Объекты функции в стандартной библиотеке C++

Объект функции(или функтор) — это любой тип, реализующий operator(). Этот оператор называется оператором вызова или иногда оператором приложения. Стандартная библиотека C++ использует объекты функций главным образом в качестве критериев сортировки для контейнеров и в алгоритмах.

Объекты функций обеспечивают два основных преимущества по сравнению с прямым вызовом функций. Во-первых, объект функции может содержать состояние. Во-вторых, объект функции является типом и поэтому может использоваться в качестве параметра шаблона.

Создание объекта функции

Чтобы создать объект функции, создайте тип и реализуйте 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 демонстрирует способ вызов объекта функции. Этот вызов выглядит как вызов функции, но фактически вызывает оператор() типа Functor. Сходство между вызовом объекта функции и вызовом функции заключается в том, как появляется термин "объект функции".

Объекты функций и контейнеры

Стандартная библиотека C++ содержит несколько объектов функций в файле заголовка <functional> . Один из этих объектов функций применяется как критерий сортировки для контейнеров. Например, контейнер set объявляется следующим образом:

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

Второй аргумент шаблона — объект функции less. Этот объект функции возвращает true , если первый параметр меньше второго параметра. Так как некоторые контейнеры сортируют их элементы, контейнеру требуется способ сравнения двух элементов. Сравнение выполняется с помощью объекта функции. Можно определить собственные критерии сортировки для контейнеров, создав объект функции и указав его в списке шаблонов для контейнера.

Объекты функций и алгоритмы

Объекты функций также используются в алгоритмах. Например, алгоритм remove_if объявляется следующим образом:

template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    Predicate pred);

Последний аргумент remove_if является объектом функции, который возвращает логическое значение ( предикат). Если результат выполнения объекта функции — значение true, элемент удаляется из контейнера, доступ к которому получают итераторы first и last. Вы можете использовать любой из объектов функции, объявленных в заголовке <functional> аргумента pred , или создать собственные объекты.

См. также

Справочник по стандартной библиотеке C++