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


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

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 или можно создать свои собственные.

См. также

Ссылки

Стандартная библиотека шаблонов