Объекты функций STL. Концепция объектов функций

   
На этом шаге мы рассмотрим общую концепцию объектов функций.

   
Начиная с этого шага мы будем знакомиться с объектами функций, или функторами.
Мы рассматрим все стандартные объекты функций и функциональные адаптеры, познакомимся с концепцией
функциональной композиции и принципами написания пользовательских объектов функций.
Концепция объектов функций

   
Объектом функции, или функтором, называется объект, для которого определен оператор (). Так,
в следующем фрагменте выражение fo() означает не вызов функции fo(), а вызов оператора () объекта
функции fo:

FunctionObjectType fo;
.    .    .    .
fo(...);

   
На первый взгляд кажется, что объект функции - это самая обычная функция, зачем-то записанная более сложным способом.
В обычной функции все необходимые команды включаются в тело функции:

void fo() { 
  команды 
}

   
В случае объекта функции команды включаются в тело оператора () класса объекта функции:

class FunctionObjectType { 
  public:
    void operator() () { 
      команды
    }
}; 

   
Действительно, такое определение более сложно, однако у него есть три важных преимущества.

  • Объект функции ведет себя более разумно, потому что может обладать состоянием. Например, можно создать два
    экземпляра одной функции, представленной объектом функции, которые могут одновременно обладать разными
    состояниями. Для обычных функций это невозможно.
  • Каждый объект функции обладает некоторым типом. Это означает, что вы можете передать объект функции
    шаблону, определяя какие-то аспекты его поведения, а контейнеры с разными объектами функций будут считаться
    относящимися к разным типам.
  • Объект функции обычно работает быстрее указателя на функцию.

   
На 115 шаге эти преимущества описаны более подробно, а пример из
116 шага показывает, что объект функции "умнее" обычной функции.

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

   
На следующем шаге мы рассмотрим объект функции в качестве критерия сортировки.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий