Функциональные объекты
Функциональный объект — это любой объект, для которого определён оператор вызова функции. C++ предоставляет множество встроенных функциональных объектов, а также средства для создания и работы с новыми функциональными объектами.
Вызов функции
| Операция Пусть тип
| (начиная с C++11) |
std::invoke и std::invoke_r(начиная с C++23) могут вызывать любые объекты вызываемого типа с заданными аргументами согласно правилам INVOKE и INVOKE<R>(начиная с C++23).
|
(C++17)(C++23) | вызывает любой объект вызываемого типа с заданными аргументами и позволяет задать тип возвращаемого значения(начиная с 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 (шаблон класса) |
Прозрачные функциональные объектыАссоциативные контейнеры и неупорядоченные ассоциативные контейнеры(начиная с C++20) предоставляют операции гетерогенного поиска и удаления(начиная с C++23), но они доступны только в том случае, если переданный тип функционального объекта Все типы прозрачных функциональных объектов стандартной библиотеки определяют вложенный тип | (начиная с C++14) |
Функциональные объекты операций
C++ определяет следующие функциональные объекты, представляющие распространённые арифметические и логические операции.
| Специализации для void выводят типы параметров и возвращаемого значения из своих аргументов; все они являются прозрачными. | (начиная с 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 | обрабатывает корректно |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/functional