Namespaces
Variants

Function objects

From 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* )

Un objeto función es cualquier objeto para el cual está definido el operador de llamada a función. C++ proporciona muchos objetos función integrados así como soporte para la creación y manipulación de nuevos objetos función.

Contenidos

Invocación de función

La operación solo de exposición INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) se define de la siguiente manera:

Sea el tipo Obj el tipo no calificado de arg_0 (es decir, std:: remove_cv < std:: remove_reference < decltype ( arg_0 ) > :: type > :: type )

  • ( obj. * f ) ( arg_1, arg_2, ..., arg_N ) (invocar la función miembro en el objeto).
  • ( obj. get ( ) . * f ) ( arg_1, arg_2, ..., arg_N ) (invocar la función miembro en el objeto referenciado especialmente).
  • En caso contrario
  • ( ( * obj ) . * f ) ( arg_1, arg_2, ..., arg_N ) (invocar la función miembro en el objeto desreferenciado).
  • obj. * mptr (accede al miembro de datos del objeto).
  • obj. get ( ) . * mptr (accede al miembro de datos del objeto referenciado especialmente).
  • En caso contrario
  • ( * obj ) . * mptr (accede al miembro de datos del objeto desreferenciado).
  • De lo contrario
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) es equivalente a f ( arg_0, arg_1, arg_2, ..., arg_N ) (invocar el objeto llamable).


La operación solo de exposición INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) se define de la siguiente manera:

  • Si R es (posiblemente calificado con cv) void
  • static_cast < void > ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) ) .
  • De lo contrario
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) convertido implícitamente a R .

Sea el tipo Actual como decltype ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) )

  • INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) está mal formado.
(desde C++23)
(desde C++11)


std::invoke y std::invoke_r (desde C++23) pueden invocar cualquier objeto Callable con los argumentos dados según las reglas de INVOKE y INVOKE<R> (desde C++23) .

(C++17) (C++23)
invoca cualquier Callable objeto con los argumentos dados y posibilidad de especificar el tipo de retorno (since C++23)
(plantilla de función)

Envoltorios de función

Estas clases de envoltorio polimórficas proporcionan soporte para almacenar objetos de función arbitrarios.

(C++11)
contenedor copiable de cualquier objeto invocable copiable
(plantilla de clase)
contenedor no copiable de cualquier objeto invocable que soporta calificadores en una firma de llamada dada
(plantilla de clase)
contenedor copiable de cualquier objeto invocable copiable que soporta calificadores en una firma de llamada dada
(plantilla de clase)
contenedor no propietario de cualquier objeto invocable
(plantilla de clase)
la excepción lanzada al invocar un std::function vacío
(clase)
(C++11)
crea un objeto función a partir de un puntero a miembro
(plantilla de función)

Identidad

std::identity es el objeto función identidad: devuelve su argumento sin cambios.

(C++20)
objeto función que devuelve su argumento sin cambios
(clase)

Aplicación parcial de funciones

std::bind_front y std::bind proporcionan soporte para aplicación parcial de funciones , es decir, vincular argumentos a funciones para producir nuevas funciones.

(C++20) (C++23)
enlaza un número variable de argumentos, en orden, a un objeto función
(plantilla de función)
(C++11)
enlaza uno o más argumentos a un objeto función
(plantilla de función)
indica que un objeto es una expresión std::bind o puede usarse como una
(plantilla de clase)
indica que un objeto es un marcador de posición estándar o puede usarse como uno
(plantilla de clase)
Definido en el espacio de nombres std::placeholders
marcadores de posición para los argumentos no enlazados en una expresión std::bind
(constante)

Negadores

std::not_fn crea un objeto función que niega el resultado del objeto invocable que se le pasa.

(C++17)
crea un objeto función que devuelve el complemento del resultado del objeto función que contiene
(plantilla de función)

Buscadores

Se proporcionan buscadores que implementan varios algoritmos de búsqueda de cadenas y pueden utilizarse directamente o con std::search .

Implementación del algoritmo de búsqueda estándar de la biblioteca C++
(plantilla de clase)
Implementación del algoritmo de búsqueda Boyer-Moore
(plantilla de clase)
Implementación del algoritmo de búsqueda Boyer-Moore-Horspool
(plantilla de clase)

Envoltorios de referencia

Los envoltorios de referencia permiten que los argumentos de referencia se almacenen en objetos función copiables:

CopyConstructible y CopyAssignable envoltorio de referencia
(plantilla de clase)
(C++11) (C++11)
crea un std::reference_wrapper con un tipo deducido de su argumento
(plantilla de función)
obtiene el tipo de referencia envuelto en std::reference_wrapper
(plantilla de clase)

Objetos función transparentes

Contenedores asociativos y contenedores asociativos no ordenados (desde C++20) proporcionan operaciones de búsqueda heterogénea y borrado (desde C++23) , pero solo están habilitadas si el tipo de objeto función suministrado T es transparente : el identificador calificado T::is_transparent es válido y denota un tipo.

Todos los tipos de objetos función transparentes en la biblioteca estándar definen un tipo anidado is_transparent . Sin embargo, los tipos de objetos función transparentes definidos por el usuario no necesitan proporcionar directamente is_transparent como tipo anidado: puede definirse en una clase base, siempre que T::is_transparent satisfaga el requisito de transparencia establecido anteriormente.

(desde C++14)

Objetos función de operador

C++ define los siguientes objetos de función que representan operaciones aritméticas y lógicas comunes.

Las especializaciones de void deducen sus tipos de parámetros y tipos de retorno de sus argumentos, todas son transparentes .

(desde C++14)
Operaciones aritméticas
objeto función que implementa x + y
(plantilla de clase)
objeto función que implementa x + y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x - y
(plantilla de clase)
objeto función que implementa x - y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x * y
(plantilla de clase)
objeto función que implementa x * y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x / y
(plantilla de clase)
objeto función que implementa x / y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x % y
(plantilla de clase)
objeto función que implementa x % y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa - x
(plantilla de clase)
objeto función que implementa - x deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
Comparaciones
objeto función que implementa x == y
(plantilla de clase)
objeto función que implementa x == y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x ! = y
(plantilla de clase)
objeto función que implementa x ! = y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x > y
(plantilla de clase)
objeto función que implementa x > y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x < y
(plantilla de clase)
objeto función que implementa x < y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x >= y
(plantilla de clase)
objeto función que implementa x >= y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x <= y
(plantilla de clase)
objeto función que implementa x <= y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
Operaciones lógicas
objeto función que implementa x && y
(plantilla de clase)
objeto función que implementa x && y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x || y
(plantilla de clase)
objeto función que implementa x || y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto de función que implementa ! x
(plantilla de clase)
objeto función que implementa ! x deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
Operaciones bit a bit
objeto función que implementa x & y
(plantilla de clase)
objeto función que implementa x & y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x | y
(plantilla de clase)
objeto función que implementa x | y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
objeto función que implementa x ^ y
(plantilla de clase)
objeto función que implementa x ^ y deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)
(C++14)
objeto función que implementa ~x
(plantilla de clase)
objeto función que implementa ~x deduciendo tipos de parámetros y retorno
(especialización de plantilla de clase)


Objetos de función de comparación restringidos

Los siguientes objetos de función de comparación están restringidos .

  • Los operadores de igualdad ( ranges::equal_to y ranges::not_equal_to ) requieren que los tipos de los argumentos satisfagan equality_comparable_with .
  • Los operadores relacionales ( ranges::less , ranges::greater , ranges::less_equal , y ranges::greater_equal ) requieren que los tipos de los argumentos satisfagan totally_ordered_with .
  • El operador de comparación de tres vías ( compare_three_way ) requiere que el tipo modele three_way_comparable_with .

Todos estos objetos de función son transparentes .

objeto de función restringido que implementa x == y
(clase)
objeto de función restringido que implementa x ! = y
(clase)
objeto de función restringido que implementa x < y
(clase)
objeto de función restringido que implementa x > y
(clase)
objeto de función restringido que implementa x <= y
(clase)
objeto de función restringido que implementa x >= y
(clase)
objeto de función restringido que implementa x <=> y
(clase)
(desde C++20)


Elementos auxiliares

Los siguientes elementos de solo exposición se utilizan para varios componentes en la biblioteca estándar pero no forman parte de la interfaz de la biblioteca estándar.

template < class Fn, class ... Args >

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

} ;
(1) ( solo para exposición* )
template < class Fn, class ... Args >

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

} ;
(2) ( solo para exposición* )
template < class Fn, class ... Args >
using /*call-result-t*/ = decltype ( std:: declval < Fn > ( ) ( std:: declval < Args > ( ) ... ) ) ;
(3) ( solo para exposición* )
template < const auto & T >
using /*decayed-typeof*/ = decltype ( auto ( T ) ) ;
(4) ( solo para exposición* )
(desde C++26)


Antiguos binders y adaptors

Varias utilidades que proporcionaban soporte funcional temprano están obsoletas y eliminadas:

Base
(obsoleto en C++11) (eliminado en C++17)
clase base de función unaria compatible con adaptadores
(plantilla de clase)
(obsoleto en C++11) (eliminado en C++17)
clase base de función binaria compatible con adaptadores
(plantilla de clase)
Binders
(obsoleto en C++11) (eliminado en C++17)
objeto función que contiene una función binaria y uno de sus argumentos
(plantilla de clase)
(obsoleto en C++11) (eliminado en C++17)
vincula un argumento a una función binaria
(plantilla de función)
Adaptadores de función
(obsoleto en C++11) (eliminado en C++17)
contenedor compatible con adaptadores para un puntero a función unaria
(plantilla de clase)
(obsoleto en C++11) (eliminado en C++17)
contenedor compatible con adaptadores para un puntero a función binaria
(plantilla de clase)
(obsoleto en C++11) (eliminado en C++17)
crea un contenedor de objeto función compatible con adaptadores a partir de un puntero a función
(plantilla de función)
(obsoleto en C++11) (eliminado en C++17)
contenedor para un puntero a función miembro nularia o unaria, invocable con un puntero a objeto
(plantilla de clase)
(obsoleto en C++11) (eliminado en C++17)
crea un contenedor a partir de un puntero a función miembro, invocable con un puntero a objeto
(plantilla de función)
contenedor para un puntero a función miembro nularia o unaria, invocable con una referencia a objeto
(plantilla de clase)
(obsoleto en C++11) (eliminado en C++17)
crea un contenedor a partir de un puntero a función miembro, invocable con una referencia a objeto
(plantilla de función)
(obsoleto en C++17) (eliminado en C++20)
objeto función contenedor que devuelve el complemento del predicado unario que contiene
(plantilla de clase)
(obsoleto en C++17) (eliminado en C++20)
objeto función contenedor que retorna el complemento del predicado binario que contiene
(plantilla de clase)
(obsoleto en C++17) (eliminado en C++20)
construye un objeto personalizado std::unary_negate
(plantilla de función)
(obsoleto en C++17) (eliminado en C++20)
construye un objeto personalizado std::binary_negate
(plantilla de función)
(hasta C++20)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 185 C++98 el uso de objetos función mejoraba la eficiencia del programa eliminó la afirmación
LWG 660 C++98 faltaban objetos función para operaciones bit a bit añadidos
LWG 2149 C++98 se requería que los objetos función que toman uno o dos argumentos
proporcionaran tipos anidados para denotar los tipos de argumento y resultado
no requerido
LWG 2219 C++11 INVOKE no manejaba correctamente std::reference_wrapper maneja correctamente
LWG 2420 C++11 INVOKE<R> no descartaba el valor de retorno si R es void descarta el valor de retorno en este caso
LWG 2926
( P0604R0 )
C++11 la sintaxis de la operación INVOKE con un tipo de
retorno R era INVOKE ( f, t1, t2, ..., tN, R )
cambiado a
INVOKE<R> ( f, t1, t2, ..., tN )
LWG 3655 C++11 INVOKE no manejaba correctamente las uniones
debido a la resolución de LWG issue 2219
maneja correctamente