Directorio de artículos
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)
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