一、定义
- std::function是函数模板类(是一个类);std::bind是函数模板(是一个函数);
- 类模板 std::function 是通用多态函数封装器,最早来自boost库,对应其boost::function函数包装器。在c++0x11中,将boost::function纳入标准库中。
- std::function 的实例能存储、复制及调用任何可调用 元素(Callable element) ,其中包括:函数、函数指针, lambda 表达式,成员函数或任意类型的函数对象。
- 它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的)
二、std::function,std::bind介绍
1. std::function
- std::function可以取代函数指针的作用,因为它可以延迟函数的执行,特别适合作为回调函数使用。它比普通函数指针更加的灵活和便利。
包含在#include <functional>
头文件中。
std::function声明:
std::function<ReturnType(paramType1,...,paramTypeN)>
不同类型可能具有相同的调用形式,如:
// 普通函数
int add(int a, int b){return a+b;}
// lambda表达式
auto mod = [](int a, int b){ return a % b;}
// 函数对象类
struct div{
int operator()(int a, int b){
return a/b;
}
};
可以用std::function将上述类型保存起来,如下:
std::function<int(int ,int)> a = add;
std::function<int(int ,int)> b = sub ;
std::function<int(int ,int)> c = div();
2. std::bind
可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:
- 将可调用对象和其参数绑定成一个防函数;
- 只绑定部分参数,减少可调用对象传入的参数。
2.1bind普通函数
#include <iostream>
#include <functional>
using namespace std;
//乘法
double multip(double a, double b) { return a * b; }
int main()
{
auto fn_2_times = bind(multip, placeholders::_1, 2);//2倍
cout << fn_2_times(10) << endl; //20
return 0;
}
bind第一个参数是函数名,这里会隐式转成函数指针;
placeholders::_1
是占位符,我理解应该是multip函数传参列表,表示第一个实参。2或者3是第二个实参。
2.2bind成员函数
class A{
public:
int Add(int n1, int n2)
{
return n1 + n2;
}
};
int main()
{
A a;
auto f = std::bind(&A::Add, &a, 100, std::placeholders::_1);
cout << f(5) << endl; // 105
}
bind第一个参数成员函数地址,第二个参数对象地址,Add传参1,Add传参2
还可以bind一个引用参数,bind成员函数指针,比较难理解,用的场景也比较少,在这不做说明。
下篇说明使用std::function和std::bind作为回调函数使用的情况,二者配合使用,非常方便。