Namespaces
Variants

Function objects

From ru.cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )

Функциональный объект — это любой объект, для которого определён оператор вызова функции. C++ предоставляет множество встроенных функциональных объектов, а также поддержку создания и управления новыми функциональными объектами.

Содержание

Вызов функции

Экспозиционная операция INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) определяется следующим образом:

Пусть тип Obj будет неквалифицированным типом arg_0 (т.е., std:: remove_cv < std:: remove_reference < decltype ( arg_0 ) > :: type > :: type )

  • ( obj. * f ) ( arg_1, arg_2, ..., arg_N ) (вызов функции-члена на объекте).
  • ( obj. get ( ) . * f ) ( arg_1, arg_2, ..., arg_N ) (вызов функции-члена на специально ссылаемом объекте).
  • В противном случае
  • ( ( * obj ) . * f ) ( arg_1, arg_2, ..., arg_N ) (вызов функции-члена на разыменованном объекте).
  • obj. * mptr (доступ к члену данных объекта).
  • obj. get ( ) . * mptr (доступ к члену данных специально указанного объекта).
  • В противном случае
  • ( * obj ) . * mptr (доступ к члену данных разыменованного объекта).
  • В противном случае
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) эквивалентно f ( arg_0, arg_1, arg_2, ..., arg_N ) (вызов вызываемого объекта).


Экспозиционная операция INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) определяется следующим образом:

  • Если R является (возможно cv-квалифицированным) void
  • static_cast < void > ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) ) .
  • В противном случае
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) неявно преобразуется в R .

Пусть тип Actual будет decltype ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) )

  • INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) является некорректным.
(начиная с C++23)
(начиная с C++11)


std::invoke и std::invoke_r (начиная с C++23) могут вызывать любой Callable объект с заданными аргументами в соответствии с правилами INVOKE и INVOKE<R> (начиная с C++23) .

(C++17) (C++23)
вызывает любой Callable объект с заданными аргументами с возможностью указания возвращаемого типа (начиная с C++23)
(шаблон функции)

Обертки функций

Эти полиморфные классы-обертки обеспечивают поддержку хранения произвольных функциональных объектов.

(C++11)
копируемая обёртка любого копируемого вызываемого объекта
(шаблон класса)
перемещаемая обёртка любого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса)
копируемая обёртка любого копируемого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса)
невладеющая обёртка любого вызываемого объекта
(шаблон класса)
исключение, выбрасываемое при вызове пустого std::function
(класс)
(C++11)
создаёт функциональный объект из указателя на член
(шаблон функции)

Идентичность

std::identity является объектом функции идентичности: он возвращает свой аргумент без изменений.

(C++20)
функциональный объект, возвращающий свой аргумент без изменений
(класс)

Частичное применение функции

std::bind_front и std::bind предоставляют поддержку для частичного применения функций , то есть привязки аргументов к функциям для создания новых функций.

(C++20) (C++23)
привязывает переменное количество аргументов, по порядку, к функциональному объекту
(шаблон функции)
(C++11)
привязывает один или более аргументов к функциональному объекту
(шаблон функции)
указывает, что объект является выражением std::bind или может быть использован как таковое
(шаблон класса)
указывает, что объект является стандартным заполнителем или может быть использован как таковой
(шаблон класса)
Определено в пространстве имен std::placeholders
заполнители для несвязанных аргументов в выражении std::bind
(константа)

Негаторы

std::not_fn создает функциональный объект, который инвертирует результат вызываемого объекта, переданного ему.

(C++17)
создает функциональный объект, который возвращает дополнение результата хранимого функционального объекта
(шаблон функции)

Поисковые системы

Предоставлены реализации нескольких алгоритмов поиска строк, которые могут использоваться либо напрямую, либо с помощью std::search .

реализация алгоритма поиска стандартной библиотеки C++
(шаблон класса)
реализация алгоритма поиска Бойера-Мура
(шаблон класса)
реализация алгоритма поиска Бойера-Мура-Хорспула
(шаблон класса)

Обертки ссылок

Ссылочные обёртки позволяют ссылочным аргументам храниться в копируемых функциональных объектах:

CopyConstructible и CopyAssignable обёртка ссылки
(шаблон класса)
(C++11) (C++11)
создаёт std::reference_wrapper с типом, выведенным из аргумента
(шаблон функции)
получить тип ссылки, обёрнутый в std::reference_wrapper
(шаблон класса)

Прозрачные функциональные объекты

Ассоциативные контейнеры и неупорядоченные ассоциативные контейнеры (since C++20) предоставляют операции гетерогенного поиска и удаления (since C++23) , но они активируются только если предоставленный тип функционального объекта T является прозрачным : квалифицированный идентификатор T::is_transparent является корректным и обозначает тип.

Все прозрачные типы функциональных объектов в стандартной библиотеке определяют вложенный тип is_transparent . Однако пользовательские прозрачные типы функциональных объектов не обязаны напрямую предоставлять is_transparent как вложенный тип: он может быть определён в базовом классе, при условии что T::is_transparent удовлетворяет указанному выше требованию прозрачности.

(since C++14)

Функциональные объекты операторов

C++ определяет следующие функциональные объекты, которые представляют основные арифметические и логические операции.

Специализации void выводят типы параметров и возвращаемые типы из своих аргументов, все они являются прозрачными .

(since C++14)
Арифметические операции
функциональный объект, реализующий x + y
(шаблон класса)
функциональный объект, реализующий x + y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x - y
(шаблон класса)
функциональный объект, реализующий x - y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x * y
(шаблон класса)
функциональный объект, реализующий x * y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x / y
(шаблон класса)
функциональный объект, реализующий x / y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x % y
(шаблон класса)
функциональный объект, реализующий x % y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий - x
(шаблон класса)
функциональный объект, реализующий - x с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
Сравнения
функциональный объект, реализующий x == y
(шаблон класса)
функциональный объект, реализующий x == y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x ! = y
(шаблон класса)
функциональный объект, реализующий x ! = y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x > y
(шаблон класса)
функциональный объект, реализующий x > y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x < y
(шаблон класса)
функциональный объект, реализующий x < y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x >= y
(шаблон класса)
функциональный объект, реализующий x >= y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x <= y
(шаблон класса)
функциональный объект, реализующий x <= y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
Логические операции
функциональный объект, реализующий x && y
(шаблон класса)
функциональный объект, реализующий x && y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x || y
(шаблон класса)
функциональный объект, реализующий x || y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий ! x
(шаблон класса)
функциональный объект, реализующий ! x с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
Побитовые операции
функциональный объект, реализующий x & y
(шаблон класса)
функциональный объект, реализующий x & y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x | y
(шаблон класса)
функциональный объект, реализующий x | y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
функциональный объект, реализующий x ^ y
(шаблон класса)
функциональный объект, реализующий x ^ y с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)
(C++14)
функциональный объект, реализующий ~x
(шаблон класса)
функциональный объект, реализующий ~x с выведением типов параметров и возвращаемого значения
(специализация шаблона класса)


Объекты функций ограниченного сравнения

Следующие объекты функций сравнения являются ограниченными .

  • Операторы равенства ( 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 .

Все эти объекты функций являются прозрачными .

ограниченный объект функции, реализующий x == y
(класс)
ограниченный объект функции, реализующий x ! = y
(класс)
ограниченный объект функции, реализующий x < y
(класс)
ограниченный объект функции, реализующий x > y
(класс)
ограниченный объект функции, реализующий x <= y
(класс)
ограниченный объект функции, реализующий x >= y
(класс)
ограниченный объект функции, реализующий x <=> y
(класс)
(начиная с C++20)


Вспомогательные элементы

Следующие элементы, предназначенные только для экспозиции, используются несколькими компонентами в стандартной библиотеке, но они не являются частью интерфейса стандартной библиотеки.

template < class Fn, class ... Args >

concept /*callable*/ =
requires ( Fn && fn, Args && ... args ) {
std:: forward < Fn > ( fn ) ( std:: forward < Args > ( args ) ... ) ;

} ;
(1) ( только для демонстрации* )
template < class Fn, class ... Args >

concept /*nothrow-callable*/ =
/*callable*/ < Fn, Args... > &&
requires ( Fn && fn, Args && ... args ) {
{ std:: forward < Fn > ( fn ) ( std:: forward < Args > ( args ) ... ) } noexcept ;

} ;
(2) ( только для демонстрации* )
template < class Fn, class ... Args >
using /*call-result-t*/ = decltype ( std:: declval < Fn > ( ) ( std:: declval < Args > ( ) ... ) ) ;
(3) ( только для демонстрации* )
template < const auto & T >
using /*decayed-typeof*/ = decltype ( auto ( T ) ) ;
(4) ( только для демонстрации* )
(начиная с C++26)


Старые связыватели и адаптеры

Некоторые утилиты, которые предоставляли раннюю функциональную поддержку, устарели и удалены:

База
(устарело в 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++11) (удалено в C++17)
создает обертку из указателя на метод, вызываемую со ссылкой на объект
(шаблон функции)
(устарело в C++17) (удалено в C++20)
объект-функция-обёртка, возвращающий дополнение унарного предиката, который он хранит
(шаблон класса)
(устарело в C++17) (удалено в C++20)
объект-функция-обёртка, возвращающий дополнение бинарного предиката, который он хранит
(шаблон класса)
(устарело в C++17) (удалено в C++20)
создает пользовательский объект std::unary_negate
(шаблон функции)
(устарело в C++17) (удалено в C++20)
создает пользовательский объект std::binary_negate
(шаблон функции)
(до 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
обрабатывает корректно