◐ Shell
clean mode source ↗

Objetos función - cppreference.com

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

Invocación de función

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

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

  • Si std::is_same<C, Obj>::value || std::is_base_of<C, Obj>::value es true
  • (obj.*f)(arg_1, arg_2, ..., arg_N) (invoca la función miembro en el objeto).
  • Si Obj es una especialización de std::reference_wrapper
  • (obj.get().*f)(arg_1, arg_2, ..., arg_N) (invoca la función miembro en el objeto especializado referido).
  • De otra manera
  • ((*obj).*f)(arg_1, arg_2, ..., arg_N) (invoca la función miembro en el objeto dereferenciado).
  • Si std::is_same<C, Obj>::value || std::is_base_of<C, Obj>::value es true
  • obj.*mptr (acceso a miembro de datos del objeto).
  • Si Obj es una especialización de std::reference_wrapper
  • obj.get().*mptr (accede al miembro de datos del objeto especializado referido).
  • De otra manera
  • (*obj).*mptr (accede al miembro de datos del objeto desreferenciado).
  • En otro caso
  • INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) es equivalente a f(arg_0, arg_1, arg_2, ..., arg_N) (invocar el invocable).


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

  • Si R es void (que puede estar calificado cv)
  • static_cast<void>(INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N)).
  • En otro caso
  • INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) implícitamente convertida a R.

El tipo Actual sea 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 argumentos dados de acuerdo con la reglas de INVOKE e INVOKE<R> (desde C++23).

Invoca cualquier objeto Callable con los argumentos dados y la posibilidad de especificar el tipo de retorno. (desde C++23)
(plantilla de función) [editar]

Envoltorios de funciones

Estas clases envolventes polimórficas proporcionan apoyo para almacenar objetos función arbitrarios.

(C++11)

Envuelve un objeto que puede ser llamado a cualquier tipo con la signatura de llamada a función especificada.
(plantilla de clase) [editar]
Envuelve un objeto invocable de cualquier tipo con la signatura de llamada a función especificada.
(plantilla de clase) [editar]
envoltura copiable de cualquier copia de objeto construible y llamable que admita calificadores en una firma de llamada determinada
(plantilla de clase) [editar]
envolvente no propietaria de cualquier objeto invocable
(plantilla de clase) [editar]
La excepción que se lanza cuando se invoca un objeto std::function vacío.
(clase) [editar]

(C++11)

Crea un objeto función de un puntero a un miembro.
(plantilla de función) [editar]

Identidad

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

Objeto función que devuelve su argumento sin cambiarlo.
(clase) [editar]

Aplicación de función parcial

std::bind_front y std::bind proporcionan apoyo para la aplicación de función parcial, es decir, la vinculación de argumentos a funciones para producir nuevas funciones.

(C++20)(C++23)

Vincula un número variable de argumentos, en orden, a un objeto función.
(plantilla de función) [editar]

(C++11)

Vincula uno o más argumentos a un objeto función.
(plantilla de función) [editar]
Indica que un objeto es una expresión std::bind o puede usarse como tal.
(plantilla de clase) [editar]
Indica que un objeto es un marcador de posición estándar o puede usarse como tal.
(plantilla de clase) [editar]

Definido en el espacio de nombres std::placeholders

Marcadores de posición para los argumentos no vinculados en una expresión std::bind.
(constante) [editar]

Negadores

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

Crea un objeto función que devuelve el complemento del resultado del objeto función que mantiene.
(plantilla de función) [editar]

Buscadores

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

Envoltorios de referencias

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

Objetos de función transparentes

Los Associative containers y los unordered associative containers (desde C++20) proporcionan operaciones de búsqueda y borredo (desde C++23) heterogéneas, pero solo están habilitados 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 de la biblioteca estándar definen un tipo anidado is_transparent. Sin embargo, los tipos de objetos de función transparentas definidos por el usuario no necesitan proporcionar directamente is_transparent como un tipo anidado: se pueden definir en una clase base, siempre que T::is_transparent satisfaga el requisito de transparencia indicado anteriormente.

(desde C++14)

Objetos función de operador

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

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

(desde C++14)
Operaciones aritméticas
Objeto función que implementa x + y
(plantilla de clase) [editar]
Objeto función que implementa x + y deduciendo el tipo del argumento y el tipo de retorno.
(especialización de plantilla de clase) [editar]
Objeto función que implementa x - y
(plantilla de clase) [editar]
Objeto función que implementa x - y deduciendo el tipo del argumento y el tipo de retorno
(especialización de plantilla de clase) [editar]
Objeto función que implementa x * y
(plantilla de clase) [editar]
Objeto función que implementa x * y deduciendo los tipos del argumento y el tipo de retorno
(especialización de plantilla de clase) [editar]
Objeto función que implementa x / y.
(plantilla de clase) [editar]
Objeto función que implementa x / y deduciendo los tipos del argumento y el tipo de retorno
(especialización de plantilla de clase) [editar]
Objeto función que implementa x % y
(plantilla de clase) [editar]
Objeto función que implementa x % y deduciendo el tipo del argumento y el tipo de retorno
(especialización de plantilla de clase) [editar]
Objeto función que implementa -x
(plantilla de clase) [editar]
objeto de función que implementa -x deduciendo los tipos de parámetro y retorno
(especialización de plantilla de clase) [editar]
Comparaciones
Objeto función que implementa x == y.
(plantilla de clase) [editar]
Objeto función que implementa x == y deduciendo los tipos de parámetro y de retorno.
(especialización de plantilla de clase) [editar]
Objeto función que implementa x != y.
(plantilla de clase) [editar]
Objeto función que implementa x != y deduciendo los tipos de parámetro y de retorno.
(especialización de plantilla de clase) [editar]
Objeto función que implementa x > y.
(plantilla de clase) [editar]
Objeto función que implementa x > y deduciendo los tipos de parámetro y de retorno.
(especialización de plantilla de clase) [editar]
Objeto función que implementa x < y.
(plantilla de clase) [editar]
Función objeto que implementa x < y deduciendo los argumentos y los tipos de retorn.
(especialización de plantilla de clase) [editar]
Objeto función que implementa x >= y.
(plantilla de clase) [editar]
objeto de función que implementa x >= y deduciendo los tipos de parámetro y retorno
(especialización de plantilla de clase) [editar]
Objeto función que implementa x <= y
(plantilla de clase) [editar]
objeto de función que implementa x <= y deduciendo los tipos de parámetro y retorno
(especialización de plantilla de clase) [editar]
Operaciones lógicas
Objeto función que implementa x && y.
(plantilla de clase) [editar]
objeto de función que implementa x && y deduciendo los tipos de parámetro y retorno
(especialización de plantilla de clase) [editar]
Objeto función que implementa x || y.
(plantilla de clase) [editar]
objeto de función que implementa x || y deduciendo los tipos de parámetro y retorno
(especialización de plantilla de clase) [editar]
Objeto función que implementa !x.
(plantilla de clase) [editar]
objeto de función que implementa !x deduciendo los tipos de parámetro y retorno
(especialización de plantilla de clase) [editar]
Operaciones a nivel de bits
Objeto función que implementa x & y.
(plantilla de clase) [editar]
objeto de función que implementa x & y deduciendo tipos de parámetro y retorno
(especialización de plantilla de clase) [editar]
Objeto función que implementa x | y.
(plantilla de clase) [editar]
Objeto función que implementa x | y deduciendo tipos de parámetro y de retorno.
(especialización de plantilla de clase) [editar]
Objeto función que implementa x ^ y.
(plantilla de clase) [editar]
objeto de función que implementa x ^ y deduciendo los tipos de parámetro y retorno
(especialización de plantilla de clase) [editar]

(C++14)

Objeto función que implementa ~x.
(plantilla de clase) [editar]
Objeto función que implementa ~x deduciendo el tipo del argumento y el tipo de retorno.
(especialización de plantilla de clase) [editar]

Elementos de ayuda

Los siguientes elementos de solo exposición se usan para varios componentes de la biblioteca estándar, pero no son parte de la interfaz de la biblioteca estándar.

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

(1) (solo de exposición*)

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) (solo de exposición*)

template< class Fn, class... Args > using /*call-result-t*/ = decltype(std::declval<Fn>()(std::declval<Args>()...));

(3) (solo de exposición*)

template< const auto& T > using /*decayed-typeof*/ = decltype(auto(T));

(4) (solo de exposición*)
(desde C++26)

Vinculadores y adaptadores antiguos

Varias utilidades que brindaban soporte funcional inicialmente están obsoletas y eliminadas:

Base

(en desuso en C++11)(eliminado en C++17)

Clase base de función unaria compatible con un adaptador.
(plantilla de clase) [editar]

(en desuso en C++11)(eliminado en C++17)

Clase base compatible con un adaptador de función binaria.
(plantilla de clase) [editar]
Vinculadores

(en desuso en C++11)(eliminado en C++17)

Objeto función que mantiene una función binaria y uno de sus argumentos.
(plantilla de clase) [editar]

(en desuso en C++11)(eliminado en C++17)

Vincula un argumento a una función binaria.
(plantilla de función) [editar]
Adaptadores de función

(en desuso en C++11)(eliminado en C++17)

Envoltorio compatible con un adaptador para un puntero a función unaria.
(plantilla de clase) [editar]

(en desuso en C++11)(eliminado en C++17)

Envoltorio compatible con un adaptador para un puntero a función binaria.
(plantilla de clase) [editar]

(en desuso en C++11)(eliminado en C++17)

Crea un envoltorio de objeto función compatible con un adaptador de un puntero a función
(plantilla de función) [editar]

(en desuso en C++11)(eliminado en C++17)

Envoltorio para un puntero a una función nularia o función miembro unaria, que puede ser llamado con un puntero a un objeto.
(plantilla de clase) [editar]

(en desuso en C++11)(eliminado en C++17)

Crea un envoltorio de un puntero a función miembro, que puede ser llamado con un puntero a un objeto.
(plantilla de función) [editar]
Envoltorio para un puntero a una función nularia o función miembro unaria, que puede ser llamado con una referencia a un objeto.
(plantilla de clase) [editar]

(en desuso en C++11)(eliminado en C++17)

Crea un envoltorio de un puntero a función miembro, que puede ser llamado con una referencia a un objeto.
(plantilla de función) [editar]

(en desuso en C++17)(eliminado en C++20)

Envoltorio de objeto función que devuelve el complemento del predicado unario que mantiene.
(plantilla de clase) [editar]

(en desuso en C++17)(eliminado en C++20)

Envoltorio de objeto función que devuelve el complemento del predicado binario que mantiene.
(plantilla de clase) [editar]

(en desuso en C++17)(eliminado en C++20)

Construye un objeto std::unary_negate personalizado.
(plantilla de función) [editar]

(en desuso en C++17)(eliminado en C++20)

Construye un objeto std::binary_negate personalizado.
(plantilla de función) [editar]
(hasta C++20)

Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 185 C++98 el uso de objetos de función mejoró la eficiencia del programa eliminado el reclamo
LWG 660 C++98 faltaban objetos de función para operaciones de bits añadido
LWG 2149 C++98 Se requería que los objetos de función que toman uno o dos argumentos
proporcionen tipos anidados para indicar los tipos de argumento y resultado
no se requiere
LWG 2219 C++11 INVOKE no manejaba correctamente std::reference_wrapper se maneja correctamente
LWG 2420 C++11 INVOKE<R> no descartaba el valor devuelto si R es void se descarta el valor devuelto en este caso
P0604R0 C++11 la sintaxis de la operación INVOKE con tipo de
retorno R era INVOKE(f, t1, t2, ..., tN, R)
se cambia a
INVOKE<R>(f, t1, t2, ..., tN)
LWG 3655 C++11 INVOKE no manejaba correctamente las uniones
debido a la resolución de Asunto LWG 2219
se maneja correctamente