[C++11] envoltorio | enlazar

1. Envoltura

comprensión conceptual

El contenedor de función también se denomina adaptador.
La función en C++ 11 es esencialmente una plantilla de clase y un contenedor.

La importancia radica en la encapsulación y readaptación del tipo de objeto invocable

Objetos invocables: punteros de función/lambdas/funtores


uso

Necesidad de incluir el archivo de encabezado funcional

Parámetro de plantilla
Ret: el tipo de retorno de la función llamada
...Args se usa como un paquete de parámetros, que contiene de 0 a cualquier número de parámetros de plantilla
Args...: el parámetro formal de la función llamada


f es un puntero de función y Functor es una clase. Los tipos de los dos son completamente diferentes. Si
desea declarar un tipo unificado, debe envolverlo con un contenedor para adaptarse al tipo de un objeto invocable unificado.

function<int(int,int)>
El primer int se usa como valor de retorno, y los dos parámetros int entre paréntesis se usan como parámetros de la función llamada.
En este momento, se puede usar un puntero de función para la inicialización , o se puede usar un funtor para la inicialización.


Para los objetos envolventes generados v1 y v2, los dos tipos son iguales
, pero al llamar, uno llama a la función f y otro llama al operador() en Functor


El envoltorio se usa como el segundo parámetro del mapa.
El valor de retorno del envoltorio es de tipo int. La función llamada tiene dos parámetros int.
Puede pasar f (puntero de función), Functor (función similar) y expresiones lambda como objetos invocables Wrapper, inicializa el wrapper

Contenedores para funciones miembro

Las funciones miembro se dividen en funciones miembro estáticas y funciones miembro no estáticas.

función miembro estática

Para las funciones de miembros estáticos, puede usar directamente la función de contenedor
para encontrar la función plusi a través de la clase Plus e inicializar el contenedor.

función miembro no estática

Para las funciones miembro ordinarias, no hay forma de usar directamente las funciones miembro ordinarias del contenedor de función.
El puntero this existe en la clase, así que agregue Plus a la función principal


Esto no es para llamar a la función de plusd directamente, sino para llamar a plusd a través del objeto Plus


Aquí no es para llamar a la función plusd directamente, sino para llamar a plusd a través de un puntero.Si
es plus*, el objeto anónimo necesita tomar la dirección
, y el objeto anónimo es un valor r y no puede tomar la dirección,
así que use Plus* en lugar de objetos anónimos


Después de agregar & al final, el problema se puede resolver (agregar & es una regla)

2. atar

comprensión conceptual

La función de vinculación se define en el archivo de encabezado y es una plantilla de función

La función de vinculación se puede ver como un adaptador de función general, que acepta un objeto invocable (objeto lambda funtor de puntero de función)
para generar un nuevo objeto invocable para adaptarse a la lista de parámetros del objeto original.


La forma general de llamar a bind: auto newCallable = bind(callable, arg_list);

Los parámetros en arg_list pueden contener nombres de la forma _n, donde n es un número entero, estos parámetros son marcadores de posición,
_1 representa el primer parámetro, _2 representa el segundo parámetro, pero por defecto (_1 y _2 se colocan en el espacio de nombres)

Los parámetros de enlace se colocan en marcadores de posición


En el espacio de nombres de marcadores de posición, existen símbolos como _1 _2 _3,
por lo que si desea utilizar _1 para representar el primer parámetro, debe acceder a _1 en el espacio de nombres de marcadores de posición, es decir, marcadores de posición::_1

Función 1 Ajustar el orden de los parámetros (no muy útil)

En circunstancias normales, pase 1 al parámetro a, pase 2 al parámetro b, imprima a=1 b=2


Si desea pasar 1 al parámetro b y 2 al parámetro a, use bind

El primer parámetro de bind es
el paquete de parámetros del objeto callable bind como marcador de posición, utilizando el espacio de nombres de marcadores de posición para acceder a los caracteres dentro (_1 _2)

Pasar el segundo parámetro 2 de la función Sub1 a a de la función Sub
Pasar el primer parámetro 1 de la función Sub1 a b de la función Sub

Después de la vinculación, se devolverá un objeto invocable. Puede elegir usar auto para deducir automáticamente el tipo
y luego llamar 1 2 nuevamente a través del objeto devuelto, el resultado será diferente


Función 2 Ajustar el número de parámetros

Aunque la función func en la clase Sub parece tener solo dos parámetros, también hay un puntero oculto.


Si usa un contenedor, necesita tres parámetros para llamar a la función func a través de un objeto anónimo


El número de parámetros en función es diferente del número de parámetros en función
Si desea el mismo número de parámetros, debe vincular y ajustar el número de parámetros.

bind puede vincular un parámetro a la muerte (pasar uno de los parámetros a la pantalla)

inserte la descripción de la imagen aquí
Pase el objeto anónimo a la pantalla, luego el objeto anónimo se vincula a
placehlders::_1 y placehlders::_2, lo que indica que los dos parámetros restantes
pueden llamar al objeto y solo necesitan pasar dos parámetros

Supongo que te gusta

Origin blog.csdn.net/qq_62939852/article/details/131523018
Recomendado
Clasificación