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

12.3.1. Предопределенные объекты-функции.

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

#include functional.

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

#include functional.

Написать:

Plus int intAdd;

Для выполнения операции сложения мы применяем перегруженный оператор вызова к intAdd точно так же, как и к классу AddImage в предыдущем разделе:

Int ival1 = 10, ival2 = 20;

// эквивалентно int sum = ival1 + ival2;

Int sum = intAdd( ival1, ival2 );

Реализация шаблона класса plus вызывает оператор сложения, ассоциированный с типом своего параметра – int. Этот и другие предопределенные объекты-функции применяются прежде всего в качестве аргументов обобщенных алгоритмов и обычно замещают подразумеваемую по умолчанию операцию. Например, по умолчанию алгоритм sort() располагает элементы контейнера в порядке возрастания с помощью оператора "меньше" базового типа. Для сортировки по убыванию мы передаем.

Vector string svec;

// ...

Предопределенный шаблон класса greater, который вызывает оператор "больше":

Sort( svec.begin(), svec.end(), greaterstring() );

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

Class Int {

Public:

Int( int ival = 0 ) : _val( ival ) {}.

Int operator-() { return -_val; }.

Int operator%(int ival) { return -_val % ival; }.

Bool operator(int ival) { return -_val ival; }.

Bool operator!() { return -_val == 0; }.

Private:

Int _val;

};

Vector string svec;

String sval1, sval2, sres;

Complex cval1, cval2, cres;

Int ival1, ival2, ires;

Int Ival1, Ival2, Ires;

15):

Double dval1, dval2, dres;

Кроме того, мы определяем два шаблона функций, которым передаем различные безымянные объекты-функции:

Template class FuncObject, class Type.

Type UnaryFunc( FuncObject fob, const Type &val ).

{ return fob( val ); }.

Template class FuncObject, class Type.

Type BinaryFunc( FuncObject fob,

Const Type &val1, const Type &val2 ).

{ return fob( val1, val2 ); }.