boost之bind

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;

}

 

 

你可能感兴趣的:(boost)