Объекты функций
Объект функции — это любой объект, для которого определён оператор вызова функции. C++ предоставляет множество встроенных объектов функций, а также поддержку создания и обработки новых объектов функций.
Вызов функции
| Операция Пусть тип
| (с C++11) |
std::invoke и std::invoke_r(с C++23) могут вызывать любой вызываемый объект с заданными аргументами в соответствии с правилами INVOKE и INVOKE<R>(с C++23).
|
(C++17)(C++23) | вызывает любой вызываемый объект с заданными аргументами и возможностью указать тип возвращаемого значения(с C++23) (шаблон функции) |
Обёртки функций
std::function предоставляет поддержку хранения произвольных объектов функций.
|
(C++11) | оборачивает вызываемый объект любого копируемого типа с указанным сигналом вызова функции (шаблон класса) |
|
(C++23) | оборачивает вызываемый объект любого типа с указанным сигналом вызова функции (шаблон класса) |
|
(C++26) | уточнение std::move_only_function которое оборачивает вызываемый объект любого копируемого типа (шаблон класса) |
|
(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 (шаблон класса) |
Функциональные объекты операторов
C++ определяет несколько функциональных объектов, представляющих общие арифметические и логические операции:
Арифметические операции |
|
функциональный объект, реализующий x + y (шаблон класса) |
|
функциональный объект, реализующий x - y (шаблон класса) |
|
функциональный объект, реализующий x * y (шаблон класса) |
|
функциональный объект, реализующий x / y (шаблон класса) |
|
функциональный объект, реализующий x % y (шаблон класса) |
|
функциональный объект, реализующий -x (шаблон класса) |
|
Сравнения |
|
функциональный объект, реализующий x == y (шаблон класса) |
|
функциональный объект, реализующий x != y (шаблон класса) |
|
функциональный объект, реализующий x > y (шаблон класса) |
|
функциональный объект, реализующий x < y (шаблон класса) |
|
функциональный объект, реализующий x >= y (шаблон класса) |
|
функциональный объект, реализующий x <= y (шаблон класса) |
|
Логические операции |
|
функциональный объект, реализующий x && y (шаблон класса) |
|
функциональный объект, реализующий x || y (шаблон класса) |
|
функциональный объект, реализующий !x (шаблон класса) |
|
Побитовые операции |
|
функциональный объект, реализующий x & y (шаблон класса) |
|
функциональный объект, реализующий x | y (шаблон класса) |
|
функциональный объект, реализующий x ^ y (шаблон класса) |
|
|
(C++14) | функциональный объект, реализующий ~x (шаблон класса) |
Прозрачные функциональные объектыАссоциативные контейнеры и неупорядоченные ассоциативные контейнеры(начиная с C++20) предоставляют операции гетерогенного поиска и удаления(начиная с C++23), но они включены только в том случае, если предоставленный тип функционального объекта Все прозрачные типы функциональных объектов в стандартной библиотеке определяют вложенный тип C++14 определяет несколько специализаций функциональных объектов, которые представляют общие арифметические и логические операции, с выводимыми типом параметра и типом возвращаемого значения:
| (начиная с C++14) | ||||||||||||||||||||||||||||||||||||||||||||||
Объекты функций сравнения с ограничениямиСледующие объекты функций сравнения ограничены. Операторы равенства (
| (с C++20) |
Старые связыватели и адаптерыНесколько утилит, обеспечивавших раннюю функциональную поддержку, устарели в C++11 и удалены в C++17 (старые отрицающие операторы устарели в C++17 и удалены в C++20):
| (до C++20) | ||||||||||||||||||||||||||||||||||||
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 185 | C++98 | использование объектов функций улучшало эффективность программы | удалено утверждение |
| LWG 660 | 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 | обрабатывает должным образом |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/functional