函数适配器bind

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] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术的微光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值