std::function
is a type erasure object. That means it erases the details of how some operations happen, and provides a uniform run time interface to them. Forstd::function
, the primary operations are copy/move, destruction, and ‘invocation’ withoperator()
— the ‘function like call operator’.
- std::function 是一个
可调用对象包装器
,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。 - 定义格式:std::function<函数类型>。
- std::function可以取代函数指针的作用,因为它可以延迟函数的执行,特别适合作为回调函数使用。它比普通函数指针更加的灵活和便利。
指定好参数和返回类型后,便可以接收所有同等类型的函数或是类。
#include <iostream>
#include <functional> //function bind
using namespace std;
function<bool(int, int)> fun; //声明一个function类型,接受两个int,返回bool
bool compare_com(int a, int b) //普通函数
{
return a > b;
}
auto compare_lambda = [](int a, int b) { return a > b; }; //lambda表达式
class compare_class
{
public:
bool operator()(int a, int b) //仿函数
{
return a > b;
}
};
class compare
{
public:
bool compare_member(int a, int b) //类的成员函数
{
return a > b;
}
static bool compare_static_member(int a, int b) //类的静态成员函数
{
return a > b;
}
};
int main()
{
fun = compare_com;
cout << fun(1, 2) << endl; //结果 0
fun = compare_lambda;
cout << fun(2, 1) << endl; //结果 1
fun = compare_class();
cout << fun(3, 1) << endl; //结果 1
fun = compare::compare_static_member;
cout << fun(1, 3) << endl; //结果 0
//类的成员函数需要使用bind,并且需要实例化对象,成员函数要加&
compare temp;
fun = std::bind(&compare::compare_member, temp, placeholders::_1, placeholders::_2);
cout << fun(1, 2) << endl; //结果 0
}
std::bind is for partial function application
std::bind 是局部函数应用
可将std::bind函数看作一个 通用的函数适配器
,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:
- 将可调用对象和其参数绑定成一个防函数;
- 只绑定部分参数,减少可调用对象传入的参数。
f(a, b, c)
//如果只是需要填充其中两个函数的话,类似于g(a, b) := f(a, 4, b)
auto g = bind(f, _1, 4, _2) //g(newa, newb) newa-> _1, newb-> _2 类似于f(newa, 4, newb)
auto g = bind(f, _2, 4, _1) //g(newa, newb) newa-> _1, newb-> _2 类似于f(nweb, 4, newa)
Reference
https://www.jianshu.com/p/4ea00ee0dabd?utm_campaign=maleskine&utm_content=note&utm_medium=writer_share&utm_source=weibo
https://www.jianshu.com/p/f191e88dcc80