«Functional (C++)»–ի խմբագրումների տարբերություն

Content deleted Content added
No edit summary
Տող 193.
 
Առաջին անգամ <tt>std::mem_fn</tt> կաղապարային ֆունկցիան հայտնվել է Member Function գրադարանում (Boost 1.25.0 տարբերակով)<ref name="BoostLibs" />։ Այն նույնպես ներառվել է C++ TR1-ում և С++11-ում։ Boost գրադարանում այն կատարելագործվում էր, որպես <tt>std::mem_fun</tt> и <tt>std::mem_fun_ref</tt> ստանդարտ ֆունկցիաների ընդհանրացում։
 
== Ֆունկցիոնալ օբյեկտներ ==
Набор предопределённых функциональных объектов для базовых операций был неотъемлемой частью стандартной библиотеки шаблонов с момента её появления в стандарте<ref name="Stepanov95" />. Это базовые [[Целое (тип данных)#.D0.90.D1.80.D0.B8.D1.84.D0.BC.D0.B5.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D0.B5 .D0.BE.D0.BF.D0.B5.D1.80.D0.B0.D1.86.D0.B8.D0.B8|арифметические операции]] (<tt>+-*/%</tt>), базовые [[Логические операции#.D0.9F.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5|логические операции]] (<tt>&&, ||, !</tt>) и [[Сравнение (программирование)|операции сравнения]] (<tt>==, !=, >, <, >=, <=</tt>). Несмотря на их тривиальность, используя именно эти классы проводилась демонстрация возможностей алгоритмов стандартной библиотеки. Также их наличие способствует удобству и избавляет пользователя библиотеки от избыточной работы по написанию собственных аналогов<ref name="Stroustrup2000" />.
Логические функторы и функторы сравнения являются предикатами и возвращают [[булевский тип]]. Начиная с С++11<ref name="C++11" />, также были добавлены некоторые [[битовые операции]] (<tt>and, or, xor, not</tt>).
{| class="wikitable" style="text-align:center"
|-
! Тип
! Название
! Кол-во операндов
! Возвращаемый тип
! Действие
|-
! rowspan="6" | Сравнения
| <tt>equal_to</tt>
| Бинарный
| bool
| <tt>x == y </tt>
|-
| <tt>not_equal_to</tt>
| Бинарный
| bool
| <tt>x != y</tt>
|-
| <tt>greater</tt>
| Бинарный
| bool
| <tt>x > y</tt>
|-
| <tt>less</tt>
| Бинарный
| bool
| <tt>x < y</tt>
|-
| <tt>greater_equal</tt>
| Бинарный
| bool
| <tt>x >= y</tt>
|-
| <tt>less_equal</tt>
| Бинарный
| bool
| <tt>x <= y</tt>
|-
! rowspan="3" | Логические
| <tt>logical_and</tt>
| Бинарный
| bool
| <tt>x && y</tt>
|-
| <tt>logical_or</tt>
| Бинарный
| bool
| <tt>x &#124;&#124; y</tt>
|-
| <tt>logical_not</tt>
| Унарный
| bool
| <tt>!x</tt>
|-
! rowspan="6" | Арифметические
| <tt>plus</tt>
| Бинарный
| T
| <tt>x + y</tt>
|-
| <tt>minus</tt>
| Бинарный
| T
| <tt>x - y</tt>
|-
| <tt>multiplies</tt>
| Бинарный
| T
| <tt>x * y</tt>
|-
| <tt>divides</tt>
| Бинарный
| T
| <tt>x / y</tt>
|-
| <tt>modulus</tt>
| Бинарный
| T
| <tt>x % y</tt>
|-
| <tt>negate</tt>
| Унарный
| T
| <tt>-x</tt>
|-
! rowspan="4" | Битовые ([[C++11]])
| <tt>bit_and</tt>
| Бинарный
| T
| <tt>x & y</tt>
|-
| <tt>bit_or</tt>
| Бинарный
| T
| <tt>x &#124; y</tt>
|-
| <tt>bit_xor</tt>
| Бинарный
| T
| <tt>x ^ y</tt>
|-
| <tt>bit_not</tt>
| Унарный
| T
| <tt>~x</tt>
|}
 
=== Ժշտողներ (negators) ===
Также, наряду с предопределёнными предикатами, в заголовочном файле имеются отрицатели предикатов, которые вызывают предикат и возвращают результат обратный результату предиката. Предикатные отрицатели сродни связывателям в том, что они принимают операцию и производят из неё другую операцию. Библиотека предоставляет два таких отрицателя: унарный <tt>not1()</tt> и бинарный <tt>not2()</tt>. Возвращаемым типом этих отрицателей есть специальные вспомогательные классы <tt>unary_negate</tt> и <tt>binary_negate</tt>, определенные следующим образом:
<source lang="cpp">
template <class Predicate> class unary_negate {
public:
explicit unary_negate(const Predicate& pred);
bool operator()(const typename Predicate::argument_type& x) const;
};
 
template <class Predicate> class binary_negate {
public:
explicit binary_negate(const Predicate& pred);
bool operator()(const typename Predicate::first_argument_type& x, const typename Predicate::second_argument_type& y) const;
</source>
Здесь <tt>operator()</tt> возвращает <tt>!pred(x)</tt> в первом случае, и <tt>!pred(x,y)</tt> во втором. Унарный предикат должен иметь определенный тип <tt>argument_type</tt>, а бинарный — типы <tt>first_argument_type</tt> и <tt>second_argument_type</tt>. Наличие таких определений у таких классов как <tt>std::function</tt>, <tt>std::mem_fn</tt> и <tt>std::ref</tt> делает возможным использование отрицателей вместе с обёртками функций.
 
В изначальной редакции стандарта <tt>unary_negate</tt> и <tt>binary_negate</tt> наследовались от базовых классов <tt>unary_function</tt> и <tt>binary_function</tt> соответственно, что предоставляло пользователю возможность использовать отрицатели для собственных предикатов. Так как упомянутые выше базовые классы были помечены устаревшими, а какой-либо замены отрицателям, помимо лямбда-функций, нет<ref>
{{cite web
| url = http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3198.htm
| title = Deprecating unary_function and binary_function (Revision 1)
| accessdate = 2013-05-03
| lang = en
| archiveurl = http://www.webcitation.org/6GgRAsP2r
| archivedate = 2013-05-17
}}</ref>, то их решено было оставить.
 
== Փաթեթների հղումներ ==