function包装器
function包装器也叫作适配器。C++中的function本质是一个类模板。function可以包装所有可调用对象(仿函数,lambda表达式,函数指针)。
---------------------------------------------------------------------------------------------------------------------------------
格式如下:
function<x1(x2)>,x1处是要包装的对象的返回值类型,x2处写出要包装的对象的参数类型。如下:
这里要注意三点:
1.非静态成员函数的函数名不是函数地址,需要要加取地址符号才能得到函数地址。
2.普通成员函数具有隐藏的this指针这一参数,包装的时候要写上。
3.既然this是指针类型,为什么第二种包装方法把参数写成对象也可以,这是因为包装器底层其实是把可调用对象作为成员变量存起来,使用包装器时先调用包装器的operator()重载,把参数传给operator(),然后operator()利用参数调用这个对象,所以实际上,这里是operator()用Plus*或者Plus()调用被包装的可调用对象,而不论是对象还是对象指针都可以调用成员函数,所以两种都可以。
---------------------------------------------------------------------------------------------------------------------------------
bind
bind是一个函数模版,他可以在一个可调用对象的基础上改变其的参数个数,参数顺序,并返回一个新函数对象。
使用如下:
_1,_2,_3....._N,这些被包含在下面的命名空间
std::placeholders;
他们是传入新函数对象(即sub1)的参数的代号,比如说sub1传入了10,5,那么_1就是10,_2就是5,而sub1会调用调用sub,在sub中你可以把_1和_2的位置变换,那么sub接受到的参数顺序是5,10,从而间接实现改变参数顺序。
当然如果bind的时候把某些参数写成具体的值,那么调用sub时这个位置的参数永远是这个值,这时你只需要传入其它参数就可以了
需要注意的是:_1,_2..._N,代表的是第一,第二,第1N个传入新函数对象的参数:
这是错误的,因为根本没传第二个参数,10是第一个参数。