#include
函数对象
FunctionObjectType fo;//定义一个变量
fo(...)//调用operator()
函数是一个对象,并不是一个简单的函数指针:void fo(...)。
- 拥有状态;
- 有类型;
- 速度比function pointor更快。
例程中,async要调用函数,我们实现了多种调用方式。
- f1:函数对象是新建出来的;
- f2:调用了print函数指针,并传入了参数;
- f3:使用lamda作为函数参数,引用了b;
- f4:直接把函数对象传入;
- f5:调用成员函数,给出了哪个成员函数,哪个对象的成员函数,及成员函数需要的参数。
LAMDA
C++11 Lambda函数 - WindSun - 博客园www.cnblogs.com
[捕捉列表] (参数) mutable -> 返回值类型 {函数体}auto
上例展示如何使用[=]以捕获父域所有对象的拷贝。
可以把a赋值给e,但是不能直接使用a.print()。
上例还展示了如何明确指出返回值的数据类型。
Lambda与STL
从C++11开始,Lambda被广泛用在STL中,比如foreach。与函数指针比起来,函数指针有巨大的缺陷:
1.函数定义在别处,阅读起来很困难;
2.使用函数指针,很可能导致编译器不对其进行inline优化,循环次数太多时,函数指针和Lambda比起来性能差距太大。函数指针不能应用在一些运行时才能决定的状态,在没有C++11时,只能用函数对象。使得学习STL算法的代价大大降低。
但是Lambda并不是仿函数的完全代替者。由Lambda的捕捉列表的限制造成的,仅能捕捉副作用域的变量。放函数具有天生跨作用域共享的特征。