Выбрать главу

plusstring stringAdd;

// вызывается string::operator+()

sres = stringAdd( sval1, sval2 );

Сложение:

plusType

*

dres = BinaryFunc( plusdouble(), dval1, dval2 );

minusint intSub;

ires = intSub( ival1, ival2 );

Вычитание:

minusType

*

dres = BinaryFunc( minusdouble(), dval1, dval2 );

multipliescomplex complexMultiplies;

cres = complexMultiplies( cval1, cval2 );

Умножение:

multipliesType

*

dres = BinaryFunc( multipliesdouble(), dval1, dval2 );dividesint intDivides;

ires = intDivides( ival1, ival2 );

Деление:

dividesType

dres = BinaryFunc( dividesdouble(), dval1, dval2 );

Взятие остатка:

modulusType

*

modulusInt IntModulus;

Ires = IntModulus( Ival1, Ival2 );

ires = BinaryFunc( modulusint(), ival1, ival2 );

negateint intNegate;

ires = intNegate( ires );

Вычисление противоположного значения:

negateType

*

12.3.3. Сравнительные объекты-функции

Сравнительные объекты-функции поддерживают операции равенства, неравенства, больше, больше или равно, меньше, меньше или равно.

equal_tostring stringEqual;

sres = stringEqual( sval1, sval2 );

ires = count_if( svec.begin(), svec.end(),

Равенство:

equal_toType

*

equal_tostring(), sval1 );

not_equal_tocomplex complexNotEqual;

cres = complexNotEqual( cval1, cval2 );

ires = count_if( svec.begin(), svec.end(),

Неравенство:

not_equal_toType

*

not_equal_tostring(), sval1 );

greaterint intGreater;

ires = intGreater( ival1, ival2 );

ires = count_if( svec.begin(), svec.end(),

Больше:

greaterType

*

greaterstring(), sval1 );

greater_equaldouble doubleGreaterEqual;

dres = doubleGreaterEqual( dval1, dval2 );

ires = count_if( svec.begin(), svec.end(),

Больше или равно:

greater_equalType

*

greater_equal string(), sval1 );

lessInt IntLess;

Ires = IntLess( Ival1, Ival2 );

ires = count_if( svec.begin(), svec.end(),

Меньше:

lessType

*

lessstring(), sval1 );

less_equalint intLessEqual;

ires = intLessEqual( ival1, ival2 );

ires = count_if( svec.begin(), svec.end(),

Меньше или равно:

less_equalType

*

less_equalstring(), sval1 );

12.3.4. Логические объекты-функции

Логические объекты-функции поддерживают операции "логическое И" (возвращает true, если оба операнда равны true, – применяет оператор &&, аcсоциированный с типом Type), "логическое ИЛИ" (возвращает true, если хотя бы один из операндов равен true, – применяет оператор ||, аcсоциированный с типом Type) и "логическое НЕ" (возвращает true, если операнд равен false, – применяет оператор !, аcсоциированный с типом Type)

logical_andint intAnd;

ires = intLess( ival1, ival2 );

Логическое И:

logical_andType

*

dres = BinaryFunc( logical_anddouble(), dval1, dval2 );

logical_orint intSub;

ires = intSub( ival1, ival2 );

Логическое ИЛИ:

logical_orType

*

dres = BinaryFunc( logical_ordouble(), dval1, dval2 );

logical_notInt IntNot;ires = IntNot( Ival1, Ival2 );

Логическое НЕ:

logical_notType

*

dres = UnaryFunc( logical_ordouble(), dval1 );

12.3.5. Адаптеры функций для объектов-функций

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

* связыватели (binders). Это адаптеры, преобразующие бинарный объект-функцию в унарный объект, связывая один из аргументов с конкретным значением. Например, для подсчета в контейнере всех элементов, которые меньше или равны 10, следует передать алгоритму count_if() объект-функцию less_equal, один из аргументов которого равен 10. В следующем разделе мы покажем, как это сделать;

* отрицатели (negators). Это адаптеры, изменяющие значение истинности объекта-функции на противоположное. Например, для подсчета всех элементов внутри контейнера, которые больше 10, мы могли бы передать алгоритму count_if() отрицатель объекта-функции less_equal, один из аргументов которого равен 10. Конечно, в данном случае проще передать связыватель объекта-функции greater, ограничив один из аргументов со значением 10.