天天看点

inline函数返回值_函数对象的使用

#include 
           

函数对象

FunctionObjectType fo;//定义一个变量
fo(...)//调用operator()
           

函数是一个对象,并不是一个简单的函数指针:void fo(...)。

  1. 拥有状态;
  2. 有类型;
  3. 速度比function pointor更快。

例程中,async要调用函数,我们实现了多种调用方式。

  • f1:函数对象是新建出来的;
  • f2:调用了print函数指针,并传入了参数;
  • f3:使用lamda作为函数参数,引用了b;
  • f4:直接把函数对象传入;
  • f5:调用成员函数,给出了哪个成员函数,哪个对象的成员函数,及成员函数需要的参数。

LAMDA

C++11 Lambda函数 - WindSun - 博客园​www.cnblogs.com

inline函数返回值_函数对象的使用
inline函数返回值_函数对象的使用
[捕捉列表] (参数) mutable -> 返回值类型 {函数体}
auto	
           

上例展示如何使用[=]以捕获父域所有对象的拷贝。

可以把a赋值给e,但是不能直接使用a.print()。

上例还展示了如何明确指出返回值的数据类型。

Lambda与STL

  从C++11开始,Lambda被广泛用在STL中,比如foreach。与函数指针比起来,函数指针有巨大的缺陷:

1.函数定义在别处,阅读起来很困难;

2.使用函数指针,很可能导致编译器不对其进行inline优化,循环次数太多时,函数指针和Lambda比起来性能差距太大。函数指针不能应用在一些运行时才能决定的状态,在没有C++11时,只能用函数对象。使得学习STL算法的代价大大降低。

但是Lambda并不是仿函数的完全代替者。由Lambda的捕捉列表的限制造成的,仅能捕捉副作用域的变量。放函数具有天生跨作用域共享的特征。