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)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容