Function objects
Функциональный объект — это любой объект, для которого определён оператор вызова функции. C++ предоставляет множество встроенных функциональных объектов, а также поддержку создания и управления новыми функциональными объектами.
Вызов функции
|
Экспозиционная операция
Пусть тип
|
(начиная с C++11) |
std::invoke
и
std::invoke_r
(начиная с C++23)
могут вызывать любой
Callable
объект с заданными аргументами в соответствии с правилами
INVOKE
и
INVOKE<R>
(начиная с C++23)
.
|
(C++17)
(C++23)
|
вызывает любой
Callable
объект с заданными аргументами
с возможностью указания возвращаемого типа
(начиная с C++23)
(шаблон функции) |
Обертки функций
Эти полиморфные классы-обертки обеспечивают поддержку хранения произвольных функциональных объектов.
|
(C++11)
|
копируемая обёртка любого копируемого вызываемого объекта
(шаблон класса) |
|
(C++23)
|
перемещаемая обёртка любого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса) |
|
(C++26)
|
копируемая обёртка любого копируемого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса) |
|
(C++26)
|
невладеющая обёртка любого вызываемого объекта
(шаблон класса) |
|
(C++11)
|
исключение, выбрасываемое при вызове пустого
std::function
(класс) |
|
(C++11)
|
создаёт функциональный объект из указателя на член
(шаблон функции) |
Идентичность
std::identity является объектом функции идентичности: он возвращает свой аргумент без изменений.
|
(C++20)
|
функциональный объект, возвращающий свой аргумент без изменений
(класс) |
Частичное применение функции
std::bind_front и std::bind предоставляют поддержку для частичного применения функций , то есть привязки аргументов к функциям для создания новых функций.
|
(C++20)
(C++23)
|
привязывает переменное количество аргументов, по порядку, к функциональному объекту
(шаблон функции) |
|
(C++11)
|
привязывает один или более аргументов к функциональному объекту
(шаблон функции) |
|
(C++11)
|
указывает, что объект является выражением
std::bind
или может быть использован как таковое
(шаблон класса) |
|
(C++11)
|
указывает, что объект является стандартным заполнителем или может быть использован как таковой
(шаблон класса) |
|
Определено в пространстве имен
std::placeholders
|
|
|
(C++11)
|
заполнители для несвязанных аргументов в выражении
std::bind
(константа) |
Негаторы
std::not_fn создает функциональный объект, который инвертирует результат вызываемого объекта, переданного ему.
|
(C++17)
|
создает функциональный объект, который возвращает дополнение результата хранимого функционального объекта
(шаблон функции) |
Поисковые системы
Предоставлены реализации нескольких алгоритмов поиска строк, которые могут использоваться либо напрямую, либо с помощью std::search .
|
(C++17)
|
реализация алгоритма поиска стандартной библиотеки C++
(шаблон класса) |
|
(C++17)
|
реализация алгоритма поиска Бойера-Мура
(шаблон класса) |
|
(C++17)
|
реализация алгоритма поиска Бойера-Мура-Хорспула
(шаблон класса) |
Обертки ссылок
Ссылочные обёртки позволяют ссылочным аргументам храниться в копируемых функциональных объектах:
|
(C++11)
|
CopyConstructible
и
CopyAssignable
обёртка ссылки
(шаблон класса) |
|
(C++11)
(C++11)
|
создаёт
std::reference_wrapper
с типом, выведенным из аргумента
(шаблон функции) |
|
(C++20)
(C++20)
|
получить тип ссылки, обёрнутый в
std::reference_wrapper
(шаблон класса) |
Прозрачные функциональные объекты
Ассоциативные контейнеры
и
неупорядоченные ассоциативные контейнеры
(since C++20)
предоставляют операции гетерогенного поиска
и удаления
(since C++23)
, но они активируются только если предоставленный тип функционального объекта
Все прозрачные типы функциональных объектов в стандартной библиотеке определяют вложенный тип
|
(since C++14) |
Функциональные объекты операторов
C++ определяет следующие функциональные объекты, которые представляют основные арифметические и логические операции.
|
Специализации void выводят типы параметров и возвращаемые типы из своих аргументов, все они являются прозрачными . |
(since C++14) |
Арифметические операции |
|
|
функциональный объект, реализующий
x
+
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
+
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
-
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
-
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
*
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
*
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
/
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
/
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
%
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
%
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
-
x
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
-
x
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
Сравнения |
|
|
функциональный объект, реализующий
x
==
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
==
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
!
=
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
!
=
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
>
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
>
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
<
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
<
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
>=
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
>=
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
<=
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
<=
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
Логические операции |
|
|
функциональный объект, реализующий
x
&&
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
&&
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
||
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
||
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
!
x
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
!
x
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
Побитовые операции |
|
|
функциональный объект, реализующий
x
&
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
&
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
|
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
|
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
функциональный объект, реализующий
x
^
y
(шаблон класса) |
|
|
(C++14)
|
функциональный объект, реализующий
x
^
y
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
|
(C++14)
|
функциональный объект, реализующий
~x
(шаблон класса) |
|
(C++14)
|
функциональный объект, реализующий
~x
с выведением типов параметров и возвращаемого значения
(специализация шаблона класса) |
Объекты функций ограниченного сравненияСледующие объекты функций сравнения являются ограниченными .
Все эти объекты функций являются прозрачными .
|
(начиная с C++20) |
Вспомогательные элементыСледующие элементы, предназначенные только для экспозиции, используются несколькими компонентами в стандартной библиотеке, но они не являются частью интерфейса стандартной библиотеки.
|
(начиная с C++26) |
Старые связыватели и адаптерыНекоторые утилиты, которые предоставляли раннюю функциональную поддержку, устарели и удалены:
|
(до C++20) | ||||||||||||||||||||||||||||||||||||
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 185 | C++98 | использование функциональных объектов улучшало эффективность программы | утверждение удалено |
| LWG 660 | C++98 | функциональные объекты для побитовых операций отсутствуют | добавлены |
| LWG 2149 | C++98 |
от функциональных объектов, принимающих один или два аргумента, требовалось
предоставление вложенных типов для обозначения типов аргументов и результата |
не требуется |
| LWG 2219 | C++11 |
INVOKE
не обрабатывал
std::reference_wrapper
корректно
|
обрабатывает корректно |
| LWG 2420 | C++11 |
INVOKE<R>
не отбрасывал возвращаемое значение, если
R
является
void
|
отбрасывает возвращаемое значение в этом случае |
|
LWG 2926
( P0604R0 ) |
C++11 |
синтаксис операции
INVOKE
с возвращаемым
типом
R
был
INVOKE
(
f, t1, t2, ..., tN, R
)
|
изменен на
INVOKE<R>
(
f, t1, t2, ..., tN
)
|
| LWG 3655 | C++11 |
INVOKE
не обрабатывал объединения корректно
из-за решения LWG issue 2219 |
обрабатывает корректно |