std::function 我的理解是一个可调用对象包装器,std::function的实例能存储、复制、调用任何可调用(callable)的目标,比如普通函数、函数对象、lambda表达式、std::bind的返回结果、成员函数等等。
直接看代码
#include <iostream>
#include<functional>
using namespace std;
int add(int a, int b) { return a + b; }
class A
{
public:
A() :m_a(1) {}
int sub(int p, int q) { return p + q - m_a; }
private:
int m_a;
};
class B
{
public:
B() :m_b(1){}
int operator()()
{
return m_b;
}
private:
int m_b;
};
int main()
{
//普通函数
function<int(int, int)> f_func1 = add;
cout << "f_func1(1,2):" << f_func1(1, 2) << endl;
//成员函数
A a;
function<int(A, int, int)> f_A_sub = &A::sub;
cout << "f_func1(1,2):" << f_A_sub(a,1, 2) << endl;;
//lambda表达式
int lam_a = 1, lam_b = 2;
function<int()> f_lambda = [lam_a, lam_b]() {return lam_a + lam_b; };
cout << "f_lambda():" << f_lambda() << endl;
//函数对象
B b;
function<int()> f_b = b;
cout << "f_b():"<<f_b() << endl;
//std::bind绑定的普通函数
function<int(int)> f_func2 = std::bind(add, std::placeholders::_1,3);
f_func2(1);
return 0;
}
普通函数:
function<int(int, int)> f_func1 = add; 很简单,不多说
成员函数:
function<int(A, int, int)> f_A_sub = &A::sub; 需要注意&A::sub前面的取地址符,因为f_A_sub需要接收的是一个类成员函数指针,还有function里function<int(A, int, int)>中指定类类型
lambda表达式:
function<int()> f_lambda = lam_a, lam_b {return lam_a + lam_b; }; function里与lambda表达式的函数形式保持一致即可
函数对象:
与类里的operator形式保持一致
std::bind绑定的普通函数:
与普通函数没有多大区别,唯一不同的是已经明确绑定的参数需要在function中去掉,就像例子中只能写一int,代表的是占位符std::placeholders::_1 。
可能整体有些绕和比较难理解,多看几遍
人,总是要有一点精神的,不是吗