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 a los predeterminados, etc. Predefinir una función para que tenga argumentos predeterminados restringe la versatilidad de una función y nos obliga a usar los argumentos predeterminados y también con valores similares cada vez. Desde C++ 11 en adelante, la introducción de la función de vinculación ha facilitado esta tarea. 

¿Cómo funciona enlazar()?  

La función de vinculación con la ayuda de marcadores de posición ayuda a manipular la posición y el número de valores que utilizará la función y modifica la función de acuerdo con el resultado deseado. 

¿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. Están representados por _1 _2 _3 ... 

Ejemplo:

CPP
   // C++ code to demonstrate bind() and   // placeholders   #include          #include         // 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          #include         // 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ó la función.   

2. La cantidad de marcadores de posición determina la cantidad 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). El resto de los valores se reemplazan por los valores predeterminados definidos por el usuario. 

CPP
   // C++ code to demonstrate placeholder   // property 2   #include         // for bind()   #include          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. La vinculación de la función está dirigida por el número y la posición de los marcadores de posición.