std::function和std::bind

可调用对象

普通函数、类的成员函数、重载了()的类对象、函数指针lambda函数

函数类型由它的返回值和参数类型决定,与函数名无关。

std::function

std::function<int(int, int)> fun声明一个返回值为int,参数为两个int的可调用对象类型。头文件#include <functional>

std::function<(返回值类型)(参数类型)>

std::bind

std::bind接受的第一个参数必须是一个可调用对象,之后接受的参数的数量必须与可调用对象的参数数量相等,这些参数将被传递给可调用对象作为入参。
绑定完成后,bind会返回一个函数对象(可以用std::function对象保存),它内部保存了可调用对象的拷贝,具有operator(),返回值类型被自动推导为可调用对象的返回值类型。
调用时,这个函数对象将把之前存储的参数转发给可调用对象完成调用。

int fun(int a);         //这是函数
std::function<int(int)> pf = std::bind(fun, 1);

需要注意的是在bind时直接写参数会造成参数绑定,哪怕后面调用的是pf(10),传入的参数也只会是1。

std::placeholders

变量占位符, 用于函数绑定时使用。

int fun(int a, int b);          //这是函数
auto pf = std::bind(fun, 1, 2);

前面说到在bind时直接写参数会造成参数绑定,而且可以省略参数(std::function对象不可省略参数,除非函数本身有默认参数)。
下面这两种方法调用的实参都是1、2。

int fun(int a, int b);          //这是函数
auto pf = std::bind(fun, 1, 2);
pf();
pf(10, 20);

那么如何在调用的时候还能指定函数参数呢?
可以采用std::placeholders变量占位符。

int fun(int a, int b);          //这是函数
auto pf = std::bind(fun, std::placeholders::_1, 2);
pf(1, 20);                      //调用fun(1, 2),因为第二个参数是绑定的
int fun(int a, int b);          //这是函数
auto pf = std::bind(fun, std::placeholders::_2, 2);
pf(1, 20);                      //调用fun(20, 2),std::placeholders::_2表示这个参数用调用时的第二个参数
int fun(int a, int b);          //这是函数
auto pf = std::bind(fun, std::placeholders::_2, std::placeholders::_1);
pf(1, 20);                      //调用fun(20, 1)
int fun(int a, int b);          //这是函数
auto pf = std::bind(fun, std::placeholders::_2, std::placeholders::_2);
pf(1, 20);                      //调用fun(20, 20)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值