目录
function
包含在<functional>头文件中,是一个类模版,但本质还是仿函数。
std::function的实例对象可以包装存储其他的可以调用对象,包括函数指针、仿函数、lambda、bind表达式等。存储的可调用对象称为它的目标。如果不含目标,则称其为空。
注:1.调用空的std::function 的目标将抛std::bad_function_call异常。
2.返回值类型和参数类型要相同
包装各种可调用对象
对于仿函数FUN,一搬使用struct,而不用class QEQ
包装类成员函数
this指针不能显式传递。
应用举例
map映射string和function
这种方式可拓展性强,并且比较省力。
bind
也包含在<functional>头文件中,是一个函数模版,本质也是仿函数。
是一个可调用对象的包装器,可以看做一个函数适配器,对接收的可调用对象进行处理后返回一个可调用对象。
可以用来调整参数个数和顺序。
一般形式
auto newCallable = bind(callable,arg_list);
newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。
当调用newCallable时,newCallable会调用callable,并传给它arg_list中的参数。
arg_list
arg_list中的参数可能包含形如_n的名字,n是一个正整数,这些参数作为占位符,表示newCallable的参数,它们占据了传递给newCallable的参数的位置。数值n表示生成的可调用对象中参数的位置:_1为newCallable的第一个参数,_2为第二个,依次向后类推。
注:这些占位符在placeholders的一个命名空间中,使用时要展开。
调整参数顺序
相当于5传给了b,23传给了a。
调整参数个数(绑死)
注意,传常量时,该常量会与指定位置的参数绑死,其他参数再按顺序_1,_2......
应用举例
在使用包装器包装类成员函数时,直接将成员函数对象绑死,就不需要每次都传了,所以bind多用于绑死一些固定参数。
小知识
1..C++11中去除了auto声明自动类型变量的功能,只可以用来进行变量类型推导。
2.auto不能推导函数参数的类型,因为函数在编译时,还没有传递参数,因此在编译时无法推演出形参的实际类型。