文章目录
包装器
std::function
std::function的作用是统一类型,用于将不同类型的函数用相同的类型表示从而实现多态
本质上是一个类模板,其实例化对象可以包装存储其它可调用对象,包括仿函数,lambda等,格式为function<返回值类型(参数类型)>
储存的对象被称为std::function的目标,若std::function不含目标,则称为空,调用空的目标会抛出异常
cpp
int add(int a, int b) { return a + b; }//普通函数
struct Mul {
int operator()(int a, int b) { return a * b; }
};//仿函数
class MyClass{
public:
static int s_add(int a,int b){
return a+b;
}
int add(int a,int b){
return a+b;
}
};
int main() {
function<int(int, int)> f;//创建一个空std::function
f = add;//装普通函数
f = Mul();//装仿函数
f = [](int a, int b) { return a - b; };//装lambda函数
f=&MyClass::s_add;//装静态成员函数,需要使用&取地址并声明类域
//装普通成员函数,也需要使用&并声明类域,还需要在std::function模板里加入类或类指针,以接收this指针
function<int(MyClass,int,int)> c_f;
function<int(MyClass*,int,int)> p_f;
c_f=&MyClass::add;
p_f=&MyClass::add;
//调用时需要将实例化的对象传进去,如果模板里是指针,则需要传地址进去
MyClass mc;
cout<<c_f(mc,1,1)<<endl;
cout<<p_f(&mc,1,1)<<endl;
function<void()> empty_func;
// empty_func();//没有目标的std::function不能调用
return 0;
}
bind
绑定是一个函数模板,也是一个可调用对象的包装器,对接收的fn可调用对象处理后返回一个可调用对象,用于调整参数的顺序和数量
auto newfunc=bing(func,arg_list),使用auto来接收返回值,调用newfunc的时候会自动调用func,并将arg_list传进去
arg_list并不是参数列表,而是newfunc中的参数的顺序,用_1,_2来表示将newfunc中的第几个参数传到func,若不用_1,则表示形参或实参
cpp
void func(int a, int b)
{
cout << a << " " << b << endl;
}
int main()
{
//调整参数顺序:把 newfunc 的第1个参数 给 func 的第2个位置
auto newfunc1 = bind(func, _2, _1);
newfunc1(10, 20); // 调用 show(20,10)
//固定参数:第一个参数固定为 100
auto newfunc2 = bind(func, 100, _1);
newfunc2(200); // 调用 show(100,200)
//减少参数数量
auto newfunc3 = bind(func, 66, 88);
newfunc3(); // 调用 show(66,88)
}