Function objects
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.
Invocación de función
|
La operación solo de exposición
Sea el tipo
|
(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) |
|
(C++23)
|
contenedor no copiable de cualquier objeto invocable que soporta calificadores en una firma de llamada dada
(plantilla de clase) |
|
(C++26)
|
contenedor copiable de cualquier objeto invocable copiable que soporta calificadores en una firma de llamada dada
(plantilla de clase) |
|
(C++26)
|
contenedor no propietario de cualquier objeto invocable
(plantilla de clase) |
|
(C++11)
|
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) |
|
(C++11)
|
indica que un objeto es una expresión
std::bind
o puede usarse como una
(plantilla de clase) |
|
(C++11)
|
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
|
|
|
(C++11)
|
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 .
|
(C++17)
|
Implementación del algoritmo de búsqueda estándar de la biblioteca C++
(plantilla de clase) |
|
(C++17)
|
Implementación del algoritmo de búsqueda Boyer-Moore
(plantilla de clase) |
|
(C++17)
|
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:
|
(C++11)
|
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) |
|
(C++20)
(C++20)
|
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
Todos los tipos de objetos función transparentes en la biblioteca estándar definen un tipo anidado
|
(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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
|
(C++14)
|
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) |
|
(C++14)
|
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 restringidosLos siguientes objetos de función de comparación están restringidos .
Todos estos objetos de función son transparentes .
|
(desde C++20) |
Elementos auxiliaresLos 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.
|
(desde C++26) |
Antiguos binders y adaptorsVarias utilidades que proporcionaban soporte funcional temprano están obsoletas y eliminadas:
|
(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 |