Поделиться через


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

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

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

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

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

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

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

template <class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>>
class set;

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

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

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

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

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

См. также

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