首页 > 代码库 > [C++] Functor与lambda

[C++] Functor与lambda

* Functor中文翻译为仿函数。
* lambda与匿名函数密不可分。lambda本身隐式地定义了对应的函数对象类型(Functor Class)以及该类的对象(Functor object)。
 

Functor

 
特性
* 可包含状态。
* 可用作模板参数。
* 与函数指针相比,Functor语法复杂(需要定义一个类型),但可保存状态。lambda既可以保存状态,语法又够简洁。
 
demo
class FunctorAdd_X{     int _state; // 状态public:    FunctorAdd_X(int _s):_state(_s){} // 初始化状态    int operator()(int y) const    {        return y+_state;    }};void TestFunctor(){    FunctorAdd_X myAdd(10);    int z = myAdd(1);    cout << z << endl;}

  

Lambda

 
 
1 lambda引入标志。[]中的=表示以值的方式捕获外部变量(只读),&表示以引用的方式捕获(可修改):
     * []没有符号,表示不捕获。
     * [&a] 以引用的方式捕获a。
     * [=,&a] 默认以值捕获,但a以引用的方式捕获。
2 参数列表
3 mutable
4 异常标识
5 返回值
6 函数体
 
demo
void TestLambda(){      // 无返回值、无参数    [](){cout << "I am in lambda." << endl;}();    // 有参数,常量传递参数    [](int x){cout << "x="<< x << endl;}(1);    // 引用的方式传递参数    int a=1;    [](int& x){ cout << "change x to " << ++x << endl;}(a);    cout << "after change,a=" << a << endl;    // 值捕获,捕获的变量只读    int b=1;    [=](){cout << " b =" << b << endl;}();    // 引用捕获    int c=1;    [&](){cout << " change c to " << ++c << endl;}();    cout << c << endl;    // 值捕获混合引用捕获    int m=1;    int n=2;    [=,&n](){++n;/*++m*/;}();    cout << "m,n="<<m<<","<<n<<endl;    // 有返回值    int d = []()->int{return 1;}();    cout << "d = " << d << endl;    // 有返回值,但不标出    int e = [](){return 1;}();    cout << "e = " << e << endl;    // 定义一个类似匿名函数    auto GetMax = [](int x,int y){ return x>y?x:y;};    int f = GetMax(1,2);    cout << "f = " << f << endl;}

  

 References


http://msdn.microsoft.com/zh-cn/library/vstudio/aa985932.aspx 函数对象
http://msdn.microsoft.com/zh-cn/library/vstudio/dd293608.aspx Lambda
http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11 Lambda expression