Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Объект-функция или 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
, или создать собственные объекты.