На этом шаге мы рассмотрим общую концепцию объектов функций.
Начиная с этого шага мы будем знакомиться с объектами функций, или функторами. Мы рассматрим все стандартные объекты функций и функциональные адаптеры, познакомимся с концепцией функциональной композиции и принципами написания пользовательских объектов функций.
Объектом функции, или функтором, называется объект, для которого определен оператор (). Так, в следующем фрагменте выражение fo() означает не вызов функции fo(), а вызов оператора () объекта функции fo:
FunctionObjectType fo; . . . . fo(...);
На первый взгляд кажется, что объект функции - это самая обычная функция, зачем-то записанная более сложным способом. В обычной функции все необходимые команды включаются в тело функции:
void fo() {
команды
}
В случае объекта функции команды включаются в тело оператора () класса объекта функции:
class FunctionObjectType { public: void operator() () { команды } };
Действительно, такое определение более сложно, однако у него есть три важных преимущества.
На 115 шаге эти преимущества описаны более подробно, а пример из 116 шага показывает, что объект функции "умнее" обычной функции.
В следующих шагах приводятся два примера работы с объектами функций. В первом примере используется тот факт, что каждый объект функции обычно обладает собственным типом. Второй пример показывает, как задействовать состояние объекта функции, а также демонстрирует одно интересное свойство алгоритма for_each().
На следующем шаге мы рассмотрим объект функции в качестве критерия сортировки.