std::function
是一个函数包装类模板,该函数包装器模板能包装任何类型的可调用元素(函数、函数指针、类成员函数指针或者任意类型的函数对象(比如定义了 operator()的类对象实例 ))。std::function对象可以被拷贝和转移。
代码示例:
#include<iostream>
#include<functional>
int g_minus(int i, int j){ return i - j; }
template <class T>
T t_minus(T i, T j){
return i - j;
}
auto l_minus = [](int i, int j) {
return i - j;
};
class minus{
public:
int operator()(int i, int j ){
return i - j;
}
};
void main(){
std::function<int(int,int)> f1= g_minus; //包装普通函数
std::function<int(int,int)> f2= t_minus<int>; //包装模板函数
std::function<int(int,int)> f3= l_minus ; //lambda表达式
minus m;
std::function<int(int,int)> f4 = m; //包装函数对象
std::cout << f1(2, 1) << f2(2, 1) << f3(2, 1) << f4(2, 1) << std::endl; //输出1111
system("pause");
}
std::bind
std::bind用来将可调用对象与其参数一起进行绑定。绑定后可以使用std::function进行保存。
1、将可调用对象与其参数绑定成一个仿函数。
2、可绑定部分参数。
在绑定部分参数的时候,通过使用std::placeholders来决定空参数将会是调用发生时的第几个参数。
#include <iostream>
#include <functional>
class A{
public:
void print(int x, int y){
std::cout << x << " " << y << std::endl;
}
int i {0};
};
void main(){
A a;
std::function<void(int,int)> f1 = std::bind(&A::print,&a,std::placeholders::_1,std::placeholders::_2);//绑定成员函数,保存为仿函数
f1(1,2);
std::function<int&(void)> f2 = std::bind(&A::i,&a);//绑定成员变量
f2() = 100; //对a的成员i进行赋值
std::cout<< a.i << std::endl;
}