码迷,mamicode.com
首页 > 编程语言 > 详细

[C++] Functor与lambda

时间:2014-07-16 21:57:10      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:blog   http   os   2014   io   re   

* 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

 
bubuko.com,布布扣
 
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

 

[C++] Functor与lambda,布布扣,bubuko.com

[C++] Functor与lambda

标签:blog   http   os   2014   io   re   

原文地址:http://www.cnblogs.com/caca/p/Cpp_functor_lambda.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!