Associare funzioni e segnaposto in C++

A volte abbiamo bisogno di manipolare il funzionamento di una funzione in base alle necessità, ad esempio cambiando alcuni argomenti in default, ecc. Predefinire una funzione da avere argomenti predefiniti limita la versatilità di una funzione e ci costringe a utilizzare gli argomenti predefiniti e anche quelli con valori simili ogni volta. Da C++11 in poi l'introduzione della funzione bind ha reso questo compito più semplice. 

Come funziona bind()?  

La funzione Associa con l'aiuto dei segnaposto aiuta a manipolare la posizione e il numero di valori da utilizzare dalla funzione e modifica la funzione in base all'output desiderato. 

Cosa sono i segnaposto?  

I segnaposto sono spazi dei nomi che dirigono la posizione di un valore in una funzione. Sono rappresentati da _1 _2 _3 ... 

Esempio:

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  ;   }   

Produzione:

5 -11 

Nel codice precedente bind() ha modificato la chiamata di una funzione per accettare 1 argomento e ha restituito l'output desiderato. 

Proprietà dei segnaposto

1. La posizione del segnaposto determina la posizione del valore nell'istruzione di chiamata della funzione 

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  ;   }   

Produzione:

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

Nel codice sopra, anche se la posizione di 1 e 13 era la stessa in una chiamata di funzione, la modifica nella posizione dei segnaposto ha cambiato il modo in cui veniva chiamata la funzione.   

2. Il numero di segnaposto determina il numero di argomenti richiesti da passare nella funzione.

Possiamo usare qualsiasi n. di segnaposto nell'istruzione di chiamata della funzione (ovviamente inferiore al numero massimo di argomenti). I valori rimanenti vengono sostituiti dai valori predefiniti definiti dall'utente. 

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  ;   }   

Produzione:

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 

Nel codice sopra chiaramente il n. di segnaposto equivalgono al numero di argomenti richiesti per chiamare la funzione. L'associazione della funzione è diretta dal numero e dalla posizione dei segnaposto.