Función de enlace y marcadores de posición en C++

A veces necesitamos manipular la operación de una función según la necesidad, es decir, cambiar algunos argumentos por defecto, etc. Predefinir una función para que tenga argumentos por defecto restringe la versatilidad de una función y nos obliga a usar los argumentos por defecto y eso también con argumentos similares. valores cada vez. Desde C++11 en adelante, la introducción de la función bind ha facilitado esta tarea. 

¿Cómo funciona bind()? 

La función de enlace con la ayuda de marcadores de posición ayuda a manipular la posición y la cantidad de valores que utilizará la función y modifica la función de acuerdo con la salida deseada. 

¿Qué son los marcadores de posición? 

Los marcadores de posición son espacios de nombres que dirigen la posición de un valor en una función. Se representan por _1, _2, _3 … 

Ejemplo:

CPP

// C++ code to demonstrate bind() and
// placeholders
#include <iostream>
#include <functional> // for bind()
using namespace std;
 
// for placeholders
using namespace std::placeholders;
 
// Driver function to demonstrate bind()
void func(int a, int b, int c)
{
    cout << (a - b - c) << endl;
}
 
int main()
{
    // for placeholders
    using namespace std::placeholders;
 
    // Use of bind() to bind the function
    // _1 is for first parameter and assigned
    // to 'a' in above declaration.
    // 2 is assigned to b
    // 3 is assigned to c
    auto fn1 = bind(func, _1, 2, 3);
 
    // 2 is assigned to a.
    // _1 is for first parameter and assigned
    // to 'b' in above declaration.
    // 3 is assigned to c.
    auto fn2 = bind(func, 2, _1, 3);
 
    // calling of modified functions
    fn1(10);
    fn2(10);
 
    return 0;
}

Producción:

5
-11

En el código anterior, bind() modificó la llamada de una función para tomar 1 argumento y devolvió el resultado deseado. 

Propiedades de los marcadores de posición

1. La posición del marcador de posición determina la posición del valor en la declaración de llamada de función 

CPP

// C++ code to demonstrate placeholder
// property 1
#include <iostream>
#include <functional> // for bind()
using namespace std;
 
// for placeholders
using namespace std::placeholders;
 
// Driver function to demonstrate bind()
void func(int a, int b, int c)
{
    cout << (a - b - c) << endl;
}
 
int main ()
{
    // for placeholders
    using namespace std::placeholders;
 
    // Second parameter to fn1() is assigned
    // to 'a' in fun().
    // 2 is assigned to 'b' in fun
    // First parameter to fn1() is assigned
    // to 'c' in fun().
    auto fn1 = bind(func, _2, 2, _1);
 
    // calling of function
    cout << "The value of function is : ";
    fn1(1, 13);
 
    // First parameter to fn2() is assigned
    // to 'a' in fun().
    // 2 is assigned to 'b' in fun
    // Second parameter to fn2() is assigned
    // to 'c' in fun().
    auto fn2 = bind(func, _1, 2, _2);
 
    // calling of same function
    cout << "The value of function after changing"
        " placeholder position is : ";
    fn2(1, 13);
 
    return 0;
}

Producción:

The value of function is : 10
The value of function after changing placeholder position is : -14

En el código anterior, aunque la posición de 1 y 13 era la misma en una llamada de función, el cambio en la posición de los marcadores de posición cambió la forma en que se llamó a la función.   

2. El número de marcadores de posición determina el número de argumentos necesarios para pasar la función.

Podemos usar cualquier no. de marcadores de posición en la declaración de llamada de función (obviamente menos que el número máximo de argumentos). Los valores restantes se reemplazan por los valores predeterminados definidos por el usuario. 

CPP

// C++ code to demonstrate placeholder
// property 2
#include <functional> // for bind()
#include <iostream>
using namespace std;
 
// for placeholders
using namespace std::placeholders;
 
// Driver function to demonstrate bind()
void func(int a, int b, int c)
{
    cout << (a - b - c) << endl;
}
 
int main()
{
    // for placeholders
    using namespace std::placeholders;
 
    // 1 placeholder
    auto fn1 = bind(func, _1, 2, 4);
 
    // calling of function with 1 argument
    cout << "The value of function with 1 "
            "placeholder is : ";
    fn1(10);
 
    // 2 placeholders
    auto fn2 = bind(func, _1, 2, _2);
 
    // calling of function with 2 arguments
    cout << "The value of function with 2"
            " placeholders is : ";
    fn2(13, 1);
 
    // 3 placeholders
    auto fn3 = bind(func, _1, _3, _2);
 
    // calling of function with 3 arguments
    cout << "The value of function with 3 "
            "placeholders is : ";
    fn3(13, 1, 4);
 
    return 0;
}

Producción:

The value of function with 1 placeholder is : 4
The value of function with 2 placeholders is : 10
The value of function with 3 placeholders is : 8

En el código anterior, claramente el no. de marcadores de posición equivale al número de argumentos necesarios para llamar a la función. El enlace de la función está dirigido por el número y la posición de los marcadores de posición. 

Este artículo es una contribución de Manjeet Singh . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *