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


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

объект функции или функтором, любой тип, реализующий оператор (). Этот оператор — оператор вызова или иногда оператор приложения. Библиотека стандартных шаблонов использует объекты функции в основном как критерии сортировки для контейнеров и в алгоритмах.

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

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

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

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

Библиотека стандартных шаблонов содержит несколько объектов функции в файле заголовка <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 объект функции, который возвращает логическое значение ( предикату). Если результат объекта функции true, элемент будет удален из контейнера, получить доступ к итераторами _First и _Last. Можно использовать любые объекты функции, объявленные в заголовке <functional> для аргумента _Pred или создать свои собственные.

См. также

Ссылки

Библиотека стандартных шаблонов