C++11 bind函数

bind函数可以看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适用”原对象的参数列表
调用bind的一般形式:auto newCallObject = bind(callObject, arg_list);
其中,newCallObject本是是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callObject的参数,
即当我们调用newCallObject时,newCallObject会调用callObject,并将arg_list中的参数传给callObject。
如果arg_list里的参数包含_n的名字,其中n是一个整数,表过“占位符”,在调用newCallObject时需要将填写相应的参数,
_1为newCallObject的第一个参数,_2为newCallObject的第二个参数,以此类推。

下面来看来示例:

#include <iostream>   //std::cout
#include <functional> // std::bind

double my_divide(double x, double y) {return x / y;}

class MyPair {
public:
    double a, b;
    double multiply() {return a * b;}
};

int main()
{
    using namespace std::placeholders;//占位符空间 adds visibility of _1, _2, _3
    //绑定普通函数
    auto fn_five = std::bind(my_divide, 10, 2);
    std::cout << "fn_five()===" << fn_five() << std::endl;
    //绑定普通函数,需要传递一个参数,参数列表从左至右_1====>x
    auto fn_half = std::bind(my_divide, _1, 2);
    std::cout << "fn_half()===" << fn_half(10) << std::endl;
    //绑定普通函数,需要传递两个参数,参数列表从左至右_1====>x,  _2===>y
    auto fn_invert = std::bind(my_divide, _2, _1);
    std::cout << "fn_invert()===" << fn_invert(10, 2) << std::endl;
    //绑定普通函数,需要传递两个参数,参数列表从左至右_1====>x,  _2===>y 与填写顺序无关
    auto fn_rounding = std::bind<int>(my_divide, _1, _2);
    std::cout << "fn_rounding()===" << fn_rounding(10, 3) << std::endl;

    MyPair ten_two {10, 2};

    //绑定成员函数
    auto bound_member_fn = std::bind(&MyPair::multiply, _1);//一个参数
    std::cout << "bound_member_fn()===" << bound_member_fn(ten_two) << std::endl;
    //绑定数据成员
    auto bound_member_data = std::bind(&MyPair::a, ten_two);
    std::cout << "bound_member_data()===" << bound_member_data() << std::endl;

    return 0;
}

参考:

http://www.cplusplus.com/reference/functional/bind/?kw=bind

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值