bind1st bind2nd在stl里面有具体的实现,只是只能绑定两个参数。
boost里面的bind使用bind(Fun f,A1 a1,A2,a2...)产生一个对象,这个对象可以有占位符,可以等到调用函数对象的时候传递参数进去即通过bind b(..);b(args);
bind绑定参数是通过存储值的形式,如果对象很大,需要耗费很大的代价,可以用ref,但是bind是延后处理的,需要保证所引用的对象在调用之前不被释放。
一.绑定普通函数
#include <iostream> #include <string> #include <boost/algorithm/string.hpp> using namespace std; using namespace boost; int f(int a,int b) { return a+ b; } int g(int a,int b,int c) { return a + b *c; } int main() { cout << bind(f,1,2)()<<endl; cout << bind(g,1,2,3)() <<endl; return 0; }
二.绑定成员函数
由于成员函数需要对象才能调用,所以需要占用bind的一个参数位置。
#include <iostream> #include <string> #include <boost/algorithm/string.hpp> #include <boost/bind.hpp> using namespace std; using namespace boost; struct demo { int f(int a,int b) { return a+ b; } }; int main() { demo a,&ra =a; demo *p = &a; cout << bind(&demo::f,a,_1,20)(10)<<endl; return 0; }
三.通过for_each迭代传递对象给bind,循环调用被适配的成员函数。
#include <iostream> #include <string> #include <vector> #include <boost/algorithm/string.hpp> #include <boost/bind.hpp> using namespace std; using namespace boost; struct demo { void print() { cout << "Hello"<<endl; } }; int main() { vector<demo> vec(10); for_each(vec.begin(),vec.end(),boost::BOOST_BIND(&demo::print,_1)); return 0; }
四.绑定成员变量,通过迭代向函数传递参数
#include <iostream> #include <string> #include <vector> #include <boost/algorithm/string.hpp> #include <boost/bind.hpp> using namespace std; using namespace boost; struct demo { void print() { cout << "Hello"<<endl; } int x; }; void print(int x) { cout << x <<endl; } int main() { demo de; de.x=357; vector<demo> vec; for (int i = 0;i < 10;++i) { vec.push_back(de); } vector<int> vec2(10); for_each(vec2.begin(),vec2.end(),bind(print,_1)); transform(vec.begin(),vec.end(),vec2.begin(),bind(&demo::x,_1)); for_each(vec2.begin(),vec2.end(),bind(print,_1)); return 0; }