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;
}
原文地址:https://www.cnblogs.com/liuweilinlin/p/3254315.html