Объекты функции
Объект функция, это любой объект, для которого определён оператор вызова функции. C++ предоставляет множество встроенных объектов функций, а также поддержку для создания и управления новыми объектами функциями.
Содержание |
[править] Вызов функции
Операция только для пояснения
Операция только для пояснения
|
(начиная с C++11) |
std::invoke
и std::invoke_r
(начиная с C++23) может вызывать любой объект Callable с заданными аргументами в соответствии с правилами INVOKE
и INVOKE<R>
(начиная с C++23).
(C++17)(C++23) |
вызывает любой Callable объект с данными аргументами и имеет возможность указать тип возврата (начиная с 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++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 определяет набор объектов функций ограниченного сравнения. Операторы равенства (ranges::equal_to
и ranges::not_equal_to
) требуют типы аргументов для модели equality_comparable_with
. Операторы отношения (ranges::less
, ranges::greater
, ranges::less_equal
и ranges::greater_equal
) требуют типы аргументов модели totally_ordered_with
. Оператору трёхстороннего сравнения требуется (compare_three_way
) тип для модели three_way_comparable_with
.
(C++20) |
функциональный объект, реализующий x == y (класс) |
(C++20) |
функциональный объект, реализующий x != y (класс) |
(C++20) |
функциональный объект, реализующий x < y (класс) |
(C++20) |
функциональный объект, реализующий x > y (класс) |
(C++20) |
функциональный объект, реализующий x <= y (класс) |
(C++20) |
функциональный объект, реализующий x >= y (класс) |
(C++20) |
функциональный объект, реализующий x <=> y (класс) |
[править] Старые привязки и адаптеры
Несколько утилит, которые обеспечивали раннюю функциональную поддержку, устарели в C++11 и удалены в C++17 (старые отрицатели устарели в C++17 и удалены в C++20):
Основа | |
(устарело в C++11)(удалено в C++17) |
совместимый с адаптором базовый класс унарной функции (шаблон класса) |
(deprecated in C++11)(удалено в C++17) |
совместимый с адаптером базовый класс бинарной функции (шаблон класса) |
Привязки | |
(устарело в C++11)(удалено в C++17) |
объект функции, содержащий бинарную функцию и один из её аргументов (шаблон класса) |
(устарело в C++11)(удалено в C++17) |
связывает один аргумент с бинарной функцией (шаблон функции) |
Адаптеры функций | |
(устарело в C++11)(удалено в C++17) |
совместимая с адаптером обёртка для указателя на унарную функцию (шаблон класса) |
(устарело в C++11)(удалено в C++17) |
совместимая с адаптером обёртка для указателя на бинарную функцию (шаблон класса) |
(устарело в C++11)(удалено в C++17) |
создаёт совместимую с адаптером обёртку функционального объекта из указателя на функцию (шаблон функции) |
(устарело в C++11)(удалено в C++17) |
оболочка для указателя на нульарную или унарную функцию-элемент, вызываемую с указателем на объект (шаблон класса) |
(устарело в C++11)(удалено в C++17) |
создаёт оболочку из указателя на функцию-элемент, вызываемую через указатель на объект (шаблон функции) |
(устарело в C++11)(удалено в C++17) |
оболочка для указателя на нульарную или унарную функцию-элемент, вызываемую со ссылкой на объект (шаблон класса) |
(устарело в C++11)(удалено в C++17) |
создаёт оболочку из указателя на функцию-элемент, вызываемую со ссылкой на объект (шаблон функции) |
(устарело в C++17)(удалено в C++20) |
обёртка объекта функции, возвращающая дополнение к унарному предикату, содержащемуся в ней (шаблон класса) |
(deprecated in C++17)(удалено в C++20) |
объект функции-обёртки, возвращающий дополнение к содержащемуся в нём бинарному предикату (шаблон класса) |
(устарело в C++17)(удалено в C++20) |
создаёт пользовательский объект std::unary_negate (шаблон функции) |
(устарело в C++17)(удалено в C++20) |
создаёт пользовательский объект std::binary_negate (шаблон функции) |
[править] Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
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 | C++11 | синтаксис операции INVOKE с возвращаемым типом R был следующим:INVOKE (f, t1, t2, ..., tN, R)
|
изменено наINVOKE<R> (f, t1, t2, ..., tN)
|
LWG 3655 | C++11 | INVOKE неправильно обрабатывал объединения из-за разрешенияLWG проблема 2219 |
обрабатывает правильно |