Язык программирования C++. Вводный курс

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


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

#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() располагает элементы контейнера в порядке возрастания с помощью оператора “меньше” базового типа. Для сортировки по убыванию мы передаем предопределенный шаблон класса greater, который вызывает оператор “больше”:

vector< string > svec;

// ...

sort( svec.begin(), svec.end(), greater<string>() );

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

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;

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 ); }



Содержание раздела