一、概述
可调用对象:
- 函数
- 函数指针
- lambda表达式 (C++11加入标准)
- 重载了函数调用运算符的类 (该类的对象称为函数对象)
- bind创建的对象
使用调用运算符来调用一个可调用对象。调用运算符:为一对括号(),里面放置实参列表(可能为空)。
二、 Lambda表达式
即匿名函数,不命名的可调用对象。每个lambda有它唯一的(未命名的,可以用auto声明类型)类类型。
完整结构:
[capture list](parameter list)->return type{function body}
其中 “ -> return type” 是一起的,为尾置返回。如果函数体中仅有一条return语句,则尾置返回可省略,lambda函数自动推断返回类型。
[capture list]捕获lambda所在函数中的局部变量,即可传入lambda函数中使用,列表可以为空,表示不使用其所在函数的其他变量;也可以设置让编译器自动捕获变量,方法为 [&]--自动捕获传引用方式, [=]--自动捕获传值方式。
最小单元:
[] {}
三、函数指针
函数指针的类型由其返回值类型和实参类型决定。
参考: https://www.cnblogs.com/youyoui/p/8933006.html
备注:
标准库function类型适配具有相同调用形式的不同可调用对象;
标准库bind函数适配不同的参数列表。
标准库std::function类型 (C++11加入标准)
function为模板,是通用的函数包装器。 std :: function的实例可以存储、复制和调用任何可调用的对象 ,包括函数,lambda表达式,绑定表达式或其他函数对象,以及指向成员函数和指向数据成员的指针。
做个比喻:
调用形式-》 可调用对象 -》 function函数包装器
电压 -》 插座 -》 万能转换插头
可调用对象的调用形式像是电压(例如,220V),不同类型的可调用对象就像不同国家的电源插口,只要电压相同(即调用形式相同),电源插口不同可以通过万能转换插头(function包装器)在不同国家使用电器。
调用形式是本质,使用的可调用对象只是一种形式,function函数包装器将相同本质的不同形式统一起来。
使用方法:
function<T> f; //可调用对象的调用形式与函数类型T相同。
f: 将f作为条件时,当f含有一个可调用对象时为真,否则为假
参考:https://blog.csdn.net/qq_35721743/article/details/83217416
标准库bind函数
bind是通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来适应原来对象的参数列表。
auto newCallable= bind(callable, arg_list);