Spec-Zone.ru › C++

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

Функциональный объект — это любой объект, для которого определён оператор вызова функции. 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 — объектом типа Obj.

  • Если f является указателем на функцию-член класса C, то INVOKE(f, obj, arg_1, arg_2, ..., arg_N) эквивалентно следующему:
  • Если std::is_same<C, Obj>::value || std::is_base_of<C, Obj>::value — это true
    • (obj.*f)(arg_1, arg_2, ..., arg_N) (вызов функции-члена для объекта).
  • Если Obj является специализацией std::reference_wrapper
    • (obj.get().*f)(arg_1, arg_2, ..., arg_N) (вызов функции-члена для специально указанного объекта).
  • В противном случае
    • ((*obj).*f)(arg_1, arg_2, ..., arg_N) (вызов функции-члена для разыменованного объекта).
  • В противном случае, если N == 0 и f является указателем на член-данные класса C, то INVOKE(mptr, obj) эквивалентно следующему:
  • Если std::is_same<C, Obj>::value || std::is_base_of<C, Obj>::value — это true
    • obj.*mptr (доступ к члену-данным объекта).
  • Если Obj является специализацией std::reference_wrapper
    • 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))

  • Если std::reference_converts_from_temporary_v <R,Actual> — это true
    • INVOKE<R>(f, arg_0, arg_1, arg_2, ..., arg_N) некорректно.
(начиная с C++23)
(начиная с C++11)


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

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

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

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

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

Тождественное преобразование

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

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

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

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

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

Отрицания

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

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

Объекты поиска

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

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

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

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

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

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

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

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

(начиная с C++14)

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

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

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

(начиная с C++14)
Арифметические операции
plus
функциональный объект, реализующий x + y
(шаблон класса)
plus<void>
(C++14)
функциональный объект, реализующий x + y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
minus
функциональный объект, реализующий x - y
(шаблон класса)
minus<void>
(C++14)
функциональный объект, реализующий x - y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
multiplies
функциональный объект, реализующий x * y
(шаблон класса)
multiplies<void>
(C++14)
функциональный объект, реализующий x * y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
divides
функциональный объект, реализующий x / y
(шаблон класса)
divides<void>
(C++14)
функциональный объект, реализующий x / y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
modulus
функциональный объект, реализующий x % y
(шаблон класса)
modulus<void>
(C++14)
функциональный объект, реализующий x % y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
negate
функциональный объект, реализующий -x
(шаблон класса)
negate<void>
(C++14)
функциональный объект, реализующий -x с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
Сравнения
equal_to
функциональный объект, реализующий x == y
(шаблон класса)
equal_to<void>
(C++14)
функциональный объект, реализующий x == y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
not_equal_to
функциональный объект, реализующий x != y
(шаблон класса)
not_equal_to<void>
(C++14)
функциональный объект, реализующий x != y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
greater
функциональный объект, реализующий x > y
(шаблон класса)
greater<void>
(C++14)
функциональный объект, реализующий x > y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
less
функциональный объект, реализующий x < y
(шаблон класса)
less<void>
(C++14)
функциональный объект, реализующий x < y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
greater_equal
функциональный объект, реализующий x >= y
(шаблон класса)
greater_equal<void>
(C++14)
функциональный объект, реализующий x >= y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
less_equal
функциональный объект, реализующий x <= y
(шаблон класса)
less_equal<void>
(C++14)
функциональный объект, реализующий x <= y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
Логические операции
logical_and
функциональный объект, реализующий x && y
(шаблон класса)
logical_and<void>
(C++14)
функциональный объект, реализующий x && y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
logical_or
функциональный объект, реализующий x || y
(шаблон класса)
logical_or<void>
(C++14)
функциональный объект, реализующий x || y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
logical_not
функциональный объект, реализующий !x
(шаблон класса)
logical_not<void>
(C++14)
функциональный объект, реализующий !x с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
Побитовые операции
bit_and
функциональный объект, реализующий x & y
(шаблон класса)
bit_and<void>
(C++14)
функциональный объект, реализующий x & y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
bit_or
функциональный объект, реализующий x | y
(шаблон класса)
bit_or<void>
(C++14)
функциональный объект, реализующий x | y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
bit_xor
функциональный объект, реализующий x ^ y
(шаблон класса)
bit_xor<void>
(C++14)
функциональный объект, реализующий x ^ y с выводом типов параметров и возвращаемого значения
(специализация шаблона класса)
bit_not
(C++14)
функциональный объект, реализующий ~x
(шаблон класса)
bit_not<void>
(C++14)
функциональный объект, реализующий ~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.

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

ranges::equal_to
(C++20)
функциональный объект с ограничениями, реализующий x == y
(класс)
ranges::not_equal_to
(C++20)
функциональный объект с ограничениями, реализующий x != y
(класс)
ranges::less
(C++20)
функциональный объект с ограничениями, реализующий x < y
(класс)
ranges::greater
(C++20)
функциональный объект с ограничениями, реализующий x > y
(класс)
ranges::less_equal
(C++20)
функциональный объект с ограничениями, реализующий x <= y
(класс)
ranges::greater_equal
(C++20)
функциональный объект с ограничениями, реализующий x >= y
(класс)
compare_three_way
(C++20)
функциональный объект с ограничениями, реализующий 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)

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

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

Базовые классы
unary_function
(устарел в C++11)(удалён в C++17)
базовый класс унарной функции, совместимый с адаптерами
(шаблон класса)
binary_function
(устарел в C++11)(удалён в C++17)
базовый класс бинарной функции, совместимый с адаптерами
(шаблон класса)
Связыватели
binder1stbinder2nd
(устарели в C++11)(удалены в C++17)
функциональный объект, хранящий бинарную функцию и один из её аргументов
(шаблон класса)
bind1stbind2nd
(устарели в C++11)(удалены в C++17)
связывает один аргумент с бинарной функцией
(шаблон функции)
Адаптеры функций
pointer_to_unary_function
(устарел в C++11)(удалён в C++17)
совместимая с адаптерами оболочка для указателя на унарную функцию
(шаблон класса)
pointer_to_binary_function
(устарел в C++11)(удалён в C++17)
совместимая с адаптерами оболочка для указателя на бинарную функцию
(шаблон класса)
ptr_fun
(устарела в C++11)(удалена в C++17)
создаёт совместимую с адаптерами оболочку функционального объекта из указателя на функцию
(шаблон функции)
mem_fun_tmem_fun1_tconst_mem_fun_tconst_mem_fun1_t
(устарели в C++11)(удалены в C++17)
оболочка для указателя на функцию-член без аргументов или с одним аргументом, вызываемая с указателем на объект
(шаблон класса)
mem_fun
(устарела в C++11)(удалена в C++17)
создаёт оболочку из указателя на функцию-член, вызываемую с указателем на объект
(шаблон функции)
mem_fun_ref_tmem_fun1_ref_tconst_mem_fun_ref_tconst_mem_fun1_ref_t
(устарели в C++11)(удалены в C++17)
оболочка для указателя на функцию-член без аргументов или с одним аргументом, вызываемая со ссылкой на объект
(шаблон класса)
mem_fun_ref
(устарела в C++11)(удалена в C++17)
создаёт оболочку из указателя на функцию-член, вызываемую со ссылкой на объект
(шаблон функции)
unary_negate
(устарел в C++17)(удалён в C++20)
функциональный объект-оболочка, возвращающий дополнение унарного предиката, который он хранит
(шаблон класса)
binary_negate
(устарел в C++17)(удалён в C++20)
функциональный объект-оболочка, возвращающий дополнение бинарного предиката, который он хранит
(шаблон класса)
not1
(устарела в C++17)(удалена в C++20)
создаёт пользовательский объект std::unary_negate
(шаблон функции)
not2
(устарела в 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
обрабатывает корректно

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/functional

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API