ربط الوظيفة والعناصر النائبة في C++

في بعض الأحيان نحتاج إلى التعامل مع تشغيل وظيفة ما وفقًا للحاجة، أي تغيير بعض الوسائط إلى الوضع الافتراضي وما إلى ذلك. الحجج الافتراضية يقيد تعدد استخدامات الوظيفة ويجبرنا على استخدام الوسائط الافتراضية وذلك أيضًا بقيم مماثلة في كل مرة. بدءًا من C++ 11 فصاعدًا، أدى إدخال وظيفة الربط إلى تسهيل هذه المهمة. 

كيف يعمل الربط ()؟  

تساعد وظيفة الربط بمساعدة العناصر النائبة على معالجة موضع وعدد القيم التي ستستخدمها الوظيفة وتعديل الوظيفة وفقًا للإخراج المطلوب. 

ما هي العناصر النائبة؟  

العناصر النائبة هي مساحات أسماء تقوم بتوجيه موضع القيمة في دالة. يتم تمثيلهم ب _1 _2 _3 ... 

مثال:

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

الإخراج:

5 -11 

في الكود أعلاه، قام bind() بتعديل استدعاء دالة لأخذ وسيطة واحدة وإرجاع الإخراج المطلوب. 

خصائص العناصر النائبة

1. يحدد موضع العنصر النائب موضع القيمة في بيان استدعاء الوظيفة 

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

الإخراج:

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

في الكود أعلاه، على الرغم من أن الموضع 1 و13 كانا متماثلين في استدعاء دالة، فإن التغيير في موضع العناصر النائبة أدى إلى تغيير طريقة استدعاء الوظيفة.   

2. يحدد عدد العناصر النائبة عدد الوسائط المطلوبة لتمرير الوظيفة.

يمكننا استخدام أي لا. من العناصر النائبة في بيان استدعاء الوظيفة (من الواضح أنها أقل من الحد الأقصى لعدد الوسائط). يتم استبدال القيم المتبقية بالقيم الافتراضية المحددة من قبل المستخدم. 

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

الإخراج:

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 

في الكود أعلاه بوضوح لا. من العناصر النائبة مساوية لعدد الوسائط المطلوبة لاستدعاء الوظيفة. يتم توجيه ربط الوظيفة من خلال عدد العناصر النائبة وموضعها.