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

Content deleted Content added
No edit summary
Տող 44.
| archivedate = 2013-05-17
}}</ref>։ Քանի որ <tt>function-ը</tt> և <tt>bind-ը</tt> մեծամասամբ կրկնօրինակում է 1998-ի ստանդարտի կապող ու փաթաթող ֆունկցիաներին, С++11-ում այդ ֆունկցիաները անվանված են հնացած (deprecated)։
 
== Ընդհանուր հասկացություններ ==
 
=== Ստանդարտի տերմինները ===
C++11 լեզվում օգտագործվում են <tt><functional></tt> վերնագրային ֆայլին վերաբերվող հետևյալ տերմինները՝
* '''Ֆունկցիայի օբյեկտի տեսակ''' (function object type) — тип [[Объект (программирование)|объекта]], который может быть типом постфиксного выражения в вызове [[Функция (программирование)|функции]], где постфиксное выражение — набор [[Перегрузка процедур и функций|перегруженных функций]], или [[Шаблоны C++#.D0.A8.D0.B0.D0.B1.D0.BB.D0.BE.D0.BD.D1.8B .D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9|шаблонов функций]], или [[Адрес (информатика)#.D0.B2.D0.B8.D1.80.D1.82.D1.83.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B9|адрес]] такого набора, или функциональный объект.
* '''Сигнатура вызова''' (call signature) — это название [[Тип возвращаемого значения|возвращаемого типа]] за которым следует в [[Скобки|круглых скобках]] список нуля или более типов [[Аргумент (программирование)|аргументов]].
* '''Вызываемый тип''' (callable type) — это или тип функционального объекта, или [[Указатель (тип данных)|указатель]] на [[Класс (программирование)#.D0.9A.D0.BB.D0.B0.D1.81.D1.81.D1.8B .D0.B8 .D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D1.8B.2C .D0.BF.D0.BE.D0.BD.D1.8F.D1.82.D0.B8.D0.B5 .D1.8D.D0.BA.D0.B7.D0.B5.D0.BC.D0.BF.D0.BB.D1.8F.D1.80.D0.B0 .D0.BA.D0.BB.D0.B0.D1.81.D1.81.D0.B0.2C .D0.BF.D0.BE.D0.BD.D1.8F.D1.82.D0.B8.D0.B5 .D1.87.D0.BB.D0.B5.D0.BD.D0.BE.D0.B2 .D0.BA.D0.BB.D0.B0.D1.81.D1.81.D0.B0|член класса]].
* '''Вызываемый объект''' (callable object) — это объект вызываемого типа.
* '''Тип обёртки вызова''' (call wrapper type) — это тип, который содержит вызываемый объект, и поддерживает [[Операторы в C и C++#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5 .D0.BE.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D1.8B|операцию вызова]], которая ведет к вызову (invoke) хранимого объекта.
* '''Обёртка вызова''' (call wrapper) — объект типа обёртки вызова.
* '''Целевой объект''' (target object) — вызываемый объект, который содержит обёртка вызова.
 
=== Понятие функционального объекта ===
Функциональный объект, или функтор — это класс с определённым [[Операторы в C и C++#.D0.94.D1.80.D1.83.D0.B3.D0.B8.D0.B5 .D0.BE.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D1.8B|оператором вызова функции]] — <tt>operator ()</tt> таким образом, что в следующем коде
<source lang="cpp">
FunctionObjectType func;
func();
</source>
выражение <tt>func()</tt> является вызовом <tt>operator()</tt> функционального объекта <tt>func</tt>, а не вызовом некоторой функции с именем <tt>func</tt>. Тип функционального объекта должен быть определён следующим образом:
<source lang="cpp">
class FunctionObjectType {
public:
void operator() () {
// Do some work
}
};
</source>
У использования функциональных объектов есть ряд преимуществ<ref name="Josuttis2012">{{Cite book| first=Nicolai M. | last=Josuttis |title= The C++ standard library : a tutorial and reference |publisher=Addison-Wesley |year=2012 |isbn=0-321-62321-5 }}</ref> перед использованием функций, а именно:
# Функциональный объект может иметь состояние. Фактически может быть два объекта одного и того же функционального типа, находящиеся в разных состояниях в одно и тоже время, что невозможно для обычных функций. Также функциональный объект может обеспечить операции предварительной инициализации данных.
# Каждый функциональный объект имеет тип, а следовательно имеется возможность передать этот тип как параметр шаблона для указания определённого поведения. К примеру, типы [[Стандартная библиотека шаблонов#.D0.9A.D0.BE.D0.BD.D1.82.D0.B5.D0.B9.D0.BD.D0.B5.D1.80.D1.8B|контейнеров]] с разными функциональными объектами отличаются.
# Объекты-функции зачастую выполняются быстрее чем указатели на функции. К примеру, встроить (<tt>inline</tt>) обращение к оператору () класса легче, чем функцию, переданную по указателю<ref name="Stroustrup2000">
{{Cite book
| first=Bjarne
| last=Stroustrup
| title=The C++ Programming Language: Special Edition
| publisher=Addison-Wesley
| year=2000
| isbn=0-201-70073-5
}}</ref>.
 
=== Պրեդիկատներ ===
Ֆունկցիոնակ օբյեկտները, որոնք վերադարձնում են [[Տրամաբանական տեսակ|բուլյան տեսակ]] անվանում են ''[[Պրեդիկատ|պրեդիկատներ]]''։ Ստանդարտ գրադարանում օգտագործում են ունար և բինար [[Պրեդիկատ|պրեդիկատներ]]։ Պրեդիկատի գործողությունները կախված չէ կատարվող գործողության պատճենման քանակից, քանի որ С++ ստանդարտը չի հաշվում, թե քանի անգամ է պատճենվել ալգորիթմը օգտագործման ժամանակ։
 
== Փաթեթավորող գործառույթներ ==