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)

  • Если 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)
(шаблон функции)

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

std::function предоставляет поддержку хранения произвольных объектов функций.

function
(C++11)
оборачивает вызываемый объект любого копируемого типа с указанным сигналом вызова функции
(шаблон класса)
move_only_function
(C++23)
оборачивает вызываемый объект любого типа с указанным сигналом вызова функции
(шаблон класса)
copyable_function
(C++26)
уточнение std::move_only_function которое оборачивает вызываемый объект любого копируемого типа
(шаблон класса)
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++ определяет несколько функциональных объектов, представляющих общие арифметические и логические операции:

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

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

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

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

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

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

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

Следующие объекты функций сравнения ограничены. Операторы равенства (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)

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

Несколько утилит, обеспечивавших раннюю функциональную поддержку, устарели в C++11 и удалены в C++17 (старые отрицающие операторы устарели в C++17 и удалены в C++20):

Базовый
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 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

Spec-Zone.ru

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