c++11-bind的用法


bind函數

在c++11之前,要綁定某個函數、函數對象或者成員函數的不同參數值需要用到不同的轉換器,如bind1st、bind2nd、fun_ptr、mem_fun和mem_fun_ref等.在c++11中,綁定參數的方法得以簡化.c++11提供了"一站式"綁定模板bind,其用法為:

#include <functional>
std::bind(待綁定的函數對象/函數指針/成員函數指針,參數綁定值1,參數綁定值2,...,參數綁定值n);

 bind的第一個參數是待綁定的函數對象或者函數指針,之后跟隨多個參數以設定待綁定函數的參數綁定方式。待綁定函數有多少個參數,則bind后便需要多少個參數以一一聲明其參數的綁定方法.當參數綁定為某一固定值時,則其對應參數綁定值可以使一個變量或常量.當需要將參數與綁定所生成的函數對象的某個參數相關聯時,則需要用到在標准中預定義的幾個常量_1、_2、_3等.這些常量聲明在std::placeholders命名空間內.

 

綁定成員函數的注意點:

在將一個R (T::*ptr)(Arg0,Arg1,...)形式的成員函數指針ptr用bind綁定參數時,bind的第一個綁定的參數是成員函數的調用者,隨后跟隨成員函數的參數綁定方式.例如bind(ptr,a,b,c)將會調用a.*ptr(b,c)。當采用_n常量將首參數與函數對象的參數相關聯時,所生成的函數對象自動可接受T類型的引用及指針類型,無需再進行封裝.但要想調用外部數據的成員函數,還需要用ref()、cref()來包裝或者綁定一個對該變量的指針.

 1 #include <functional>
 2 #include <iostream>
 3 
 4 //一個自定義的整數類
 5 struct integer{
 6       int i;
 7       integer(int i):i(i){}
 8       void incr_by(int j){ i+=j;}
 9 };
10 
11 void mem_func_sample(){
12      integer x(0);    //x.i=0;
13      integer *y=&x;   //y指向x
14      using namespace std::placeholders;
15      using namespace std;
16      
17      auto f0=bind(&integer::incr_by,_1,_2);
18      f0(x,2);     //x.incr_by(2)
19      cout<<x.i<<endl;
20      
21      f0(y,2);         //y->incr_by(2)
22      cout<<x.i<<endl;   //x.i=4
23      
24      auto f1=bind(&integer::incr_by,x,_1);
25      f1(2);   //x在f1的副本.incr(2)
26      cout<<x.i<<endl;  x.i=4;
27      
28      auto f2=bind(&integer::ince_by,ref(x),_1);
29      f2(2);   //x.incr_by(2)
30      cout<<x.i<<endl;       //x.i=6;
31      
32      auto f3=bind(&integer::incr_by,&x,_1);
33      f3(2);   //(&x)->incr_by(2)
34      cout<<x.i<<endl;  //x.i=8
35      
36      //利用mem_fn將成員函數轉換為函數對象
37      auto f4=mem_fn(&integer::incr_by);
38      f4(x,2);  
39      cout<<x.i<<endl;//x.i=10;
40      f4(y,2);   
41      cout<<x.i<<endl;//x.i=12
42      
43      
44 }

上例中用不同的方式為integer類的incr_by成員函數綁定參數.對於所得的函數對象f0,由於bind的首參數與f0的第一個參數相關聯,f0將自動以integer為首參數類型,所以f0(x,2)實際調用了x.incr_by(2),使得x的i值增加2;另外f0也自動支持integr指針,所以調用f0(y,2)相等於執行了y->incr_by(2),同樣使得x的i值增加2。而f1的調用是x在f1內的副本,不會影響x的狀態.只有如f2或f3那樣綁定x才會真正調用x的成員函數.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM