bind函数适配器
接受函数参数,返回可调用该函数的函数对象,本质还是函数对象
bind——使用“额外实参”来绑定任意参数
在以前的老代码中较多使用,新的代码一般使用lambda实现了,此处主要是了解,方便代码阅读
实例代码
#include <functional>
#include <iostream>
#include <vector>
using namespace std;
using namespace std::placeholders;
template<typename Container, typename Func>
void foreach (Container c, Func op)
{
for(auto& data : c)
{
op(data); //接收1个参数,如果想将2参数的print1在此处用上
}
}
void print1(int data, string prefix ) //接收2个参数
{
cout<<prefix << data ;
}
void print2(int data, string prefix, string postfix )
{
cout<<prefix << data <<postfix ;
}
bool compare(int data1, int data2, bool is_abs )
{
if(is_abs)
{ return abs(data1)> abs(data2);}
else
{ return data1> data2;}
}
int main()
{
vector<int> v = { 8,-5,2,-4,7,-1,9 };
//返回一个函数对象(类型为__bind) _1实际是placeholders:*1 (最多可以10个)
auto binder=std::bind(print1, _1, " * "); //将两个参数合并为1个参数,此处表示*填充print1的第二个参数
binder(100); // 相当于print1(100,"*");
cout<<endl;
//绑定单参数的函数对象
foreach(v, binder); //因为foreach的op只要一个参数
foreach(v, std::bind(print1, _1, " * ")); //也可以直接返回函数对象
cout<<endl;
//绑定两参数的函数对象
foreach(v, std::bind(print2, _1, "[", "] "));
cout<<endl;
sort(v.begin(),v.end(), std::bind(compare,_1,_2, true)); //绑定两个函数对象生成的参数1,2
foreach(v, std::bind(print2, _1, "{", "} "));
cout<<endl;
sort(v.begin(),v.end(), std::bind(compare,_1,_2, false));
foreach(v, std::bind(print2, _1, "{", "} "));
cout<<endl;
cout<<"\nlambda: "<<endl;
/*使用lamda更方便,可读性更好————可以取代bind了*/
/*所有std::bind都可以用lambda表达式实现,目前主要是老库中实现*/
vector<int> v2 = { 10,-10,7,-5,8,-2,18};
sort(v2.begin(),v2.end(), [](auto data1, auto data2){
return compare(data1,data2,true);});
foreach(v2, [](auto data){ cout<<"[" << data <<"] ";});
cout<<endl;
sort(v2.begin(),v2.end(), [](auto data1, auto data2){
return (data1 > data2);});
foreach(v2, [](auto data){ cout<<"[" << data <<"] ";});
cout<<endl;
}
编译及运行
kongcb@tcu-pc:~/testcode/lambda$ g++ bind.cpp -o bind
kongcb@tcu-pc:~/testcode/lambda$ ./bind
* 100
* 8 * -5 * 2 * -4 * 7 * -1 * 9 * 8 * -5 * 2 * -4 * 7 * -1 * 9
[8] [-5] [2] [-4] [7] [-1] [9]
{9} {8} {7} {-5} {-4} {2} {-1}
{9} {8} {7} {2} {-1} {-4} {-5}
lambda:
[18] [10] [-10] [8] [7] [-5] [-2]
[18] [10] [8] [7] [-2] [-5] [-10]