boost::bind
bind并不是一个单独的类或函数,而是非常庞大的家族,依据绑定的参数个数和要绑定的调用对象类型,总共有十个不同的形式,但它们的名字都叫bind.
bind接受的第一个参数必须是一个可调用对象f,包括函数,函数指针,函数对象和成员函数,之后bind接受最多9个参数,参数的数量必须与f的参数数量相等
_1,_2这些一直可以到9,是占位符,必须在绑定表达式中提供函数要求的所有参数,无论是真实参数还是占位符均可以。占位符不可以超过函数参数数量。
绑定普通函数:
1.#include<boost/bind.hpp> 2.#include<iostream> 3.using namespace std; 4.using namespace boost; 5. 6.void fun(int a,int b){ 7. cout << a+b << endl; 8.} 9. 10.int main() 11.{ 12. bind(fun,1,2)();//fun(1,2) 13. bind(fun,_1,_2)(1,2);//fun(1,2) 14. bind(fun,_2,_1)(1,2);//fun(2,1) 15. bind(fun,_2,_2)(1,2);//fun(2,2) 16. bind(fun,_1,3)(1);//fun(1,3) 17.} 18. 19. 20.3 21.3 22.3 23.4 24.4
绑定成员函数:
1.#include<boost/bind.hpp> 2.#include<iostream> 3.#include<vector> 4.#include<algorithm> 5.using namespace boost; 6.using namespace std; 7. 8.struct point 9.{ 10. int x,y; 11. point(int a=0,int b=0):x(a),y(b){} 12. void print(){ 13. cout << "(" << x << "," << y << ")\n"; 14. } 15. void setX(int a){ 16. cout << "setX:" << a << endl; 17. } 18. void setXY(int x,int y){ 19. cout << "setX:" << x << ",setY:" << y << endl; 20. } 21. void setXYZ(int x,int y,int z){ 22. cout << "setX:" << x << ",setY:" << y << "setZ:" << z << endl; 23. } 24.}; 25. 26.int main() 27.{ 28. point p1,p2; 29. bind(&point::setX,p1,_1)(10); 30. bind(&point::setXY,p1,_1,_2)(10,20); 31. bind(&point::setXYZ,p2,_1,_2,_3)(10,20,30); 32. vector<point> v(10); 33. //for_each的时候只需要_1就可以了 34. for_each(v.begin(),v.end(),bind(&point::print,_1)); 35. for_each(v.begin(),v.end(),bind(&point::setX,_1,10)); 36. for_each(v.begin(),v.end(),bind(&point::setXY,_1,10,20)); 37. for_each(v.begin(),v.end(),bind(&point::setXYZ,_1,10,20,30)); 38.} 39. 40.setX:10 41.setX:10,setY:20 42.setX:10,setY:20setZ:30 43.(0,0) 44.(0,0) 45.(0,0) 46.(0,0) 47.(0,0) 48.(0,0) 49.(0,0) 50.(0,0) 51.(0,0) 52.(0,0) 53.setX:10 54.setX:10 55.setX:10 56.setX:10 57.setX:10 58.setX:10 59.setX:10 60.setX:10 61.setX:10 62.setX:10 63.setX:10,setY:20 64.setX:10,setY:20 65.setX:10,setY:20 66.setX:10,setY:20 67.setX:10,setY:20 68.setX:10,setY:20 69.setX:10,setY:20 70.setX:10,setY:20 71.setX:10,setY:20 72.setX:10,setY:20 73.setX:10,setY:20setZ:30 74.setX:10,setY:20setZ:30 75.setX:10,setY:20setZ:30 76.setX:10,setY:20setZ:30 77.setX:10,setY:20setZ:30 78.setX:10,setY:20setZ:30 79.setX:10,setY:20setZ:30 80.setX:10,setY:20setZ:30 81.setX:10,setY:20setZ:30 82.setX:10,setY:20setZ:30
http://www.cnblogs.com/lzjsky/archive/2011/09/07/2169820.html