Объекты функции
A объект функцииили functorлюбой тип, реализующий оператор ().Этот оператор называется оператор вызова или иногда оператор приложения.Стандартная библиотека шаблонов использует объекты функции в основном в качестве критерия сортировки для контейнеров и в алгоритмах.
Объекты функции предоставляют 2 основных преимущества по сравнению с прямым вызовом функции.Первое, что объект функции может содержать условие.Второе, что объект функции тип и, следовательно, может быть использован в качестве параметра шаблона.
Создание объекта функции
Чтобы создать объект функции, создайте функциональные оператор типа и (), например:
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.Это сходство между вызвать объект функции и функции как объект функции пришел терминов.
Объекты и контейнеры функции
Стандартная библиотека шаблонов содержит несколько объектов функции <functional> файл заголовка.Использование этих объектов одной функции в качестве критерия сортировки для контейнеров.Например, set контейнер объявлен следующим образом:
template <
class Key,
class Traits=less<Key>,
class Allocator=allocator<Key> >
class set
Второй аргумент шаблона объект функции less.Этот объект функции возвращает true если первый параметр меньше второго, переданного ей передан параметр.Поскольку некоторые контейнеры сортируют их элементы, контейнер необходим способ сравнения 2 элемента, а это достигается с помощью объекта функции.Можно определить собственную критерии сортировки для контейнеров путем создания объекта функции и указав ее в списке шаблонов для контейнера.
Объекты и функции
Другая использование функциональных объектов в алгоритмах.Например, remove_if алгоритм объявлен следующим образом:
template<class ForwardIterator, class Predicate>
ForwardIterator remove_if(
ForwardIterator _First,
ForwardIterator _Last,
Predicate _Pred
);
Последний аргумент remove_if объект функции, который возвращает логическое значение (a предикат).Если результат объекта функции trueпосле этого элемент удаляется из контейнера, доступ к которому осуществлялся итераторами _First и _Last.Можно использовать любые объекты, объявленные в функции <functional> заголовок для аргумента _Pred или можно создать свои собственные.