C++ для начинающих.

12.3.6. Реализация объекта-функции.

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

// простейшая форма класса объекта-функции.

Class less_equal_ten {

Public:

Bool operator() ( int val ).

{ return val = 10; }.

Некоторое значение меньше или равно 10:

};

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

Count_if( vec.begin(), vec.end(), less_equal_ten() );

Разумеется, возможности этого класса весьма ограничены. Попробуем применить.

Count_if( vec.begin(), vec.end(),

Отрицатель, чтобы подсчитать, сколько в контейнере элементов, больших 10:

Not1(less_equal_then ()));

Или обобщить реализацию, разрешив пользователю задавать значение, с которым надо сравнивать каждый элемент контейнера. Для этого достаточно ввести в класс член для хранения такого значения и реализовать конструктор, инициализирующий данный член.

Class less_equal_value {

Public:

Less_equal_value( int val ) : _val( val ) {}.

Bool operator() ( int val ) { return val = _val; }.

Private:

Int _val;

Указанной пользователем величиной:

};

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

Count_if( vec.begin(), vec.end(), less_equal_value( 25 ));

Разрешается реализовать класс и без конструктора, если параметризовать его значением, с которым производится сравнение:

Template int _val.

Class less_equal_value {

Public:

Bool operator() ( int val ) { return val = _val; }.

};

Вот как надо было бы вызвать такой класс для подсчета числа элементов, меньших или равных 25:

Count_if( vec.begin(), vec.end(), less_equal_value25());

(Другие примеры определения собственных объектов-функций можно найти в Приложении.).

Упражнение 12.4.

Используя предопределенные объекты-функции и адаптеры, создайте объекты-функции для решения следующих задач:

(a)Найти все значения, большие или равные 1024.

(b)Найти все строки, не равные "pooh".

(c)Умножить все значения на 2.

Упражнение 12.5.

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