• 罗剑锋
    置顶
    2020-05-29
    我在GitHub的lambd.cpp里写了一小段代码,示范了function + lambda实现成员函数的方法,算是对课下作业2的一个参考,同学们可以看看。
    共 2 条评论
    22
  • 冻冻
    2020-05-28
    老师,用“map+lambda”的方式来替换难以维护的 if/else/switch,能举个例子吗?

    作者回复: 这个需要用到std::function,存储lambda表达式,比如 ~~~ map<int, function<void()>> funcs; funcs[1] = [](){...}; funcs[7] = [](){...}; funcs[42] = [](){...}; return funcs[x](); ~~~ 这样,就把switch/case语句转换成了function+lambda,让map替你自动switch。

    共 6 条评论
    62
  • 被讨厌的勇气
    2020-05-28
    采用lambda表达式替换类的成员函数,成员变量通过 '[this]'可以捕获(相当于成员函数中的this参数),参数、返回值、函数体,lambda表达式都可以实现,所以理论上,是可以替换的。 试了一下,报错:在类内部无法定义auto。之前老师提到过的。

    作者回复: 对的,就是这个原因。

    
    22
  • xGdl
    2020-06-04
    lambda由类的operator重载而来,最大的特征是携带私货(闭包),我一般使用闭包最多的就是将任务打包Task推送线程池或下一个流程。这一过程在没有闭包之前,实现起来有些麻烦。

    作者回复: 这个就是闭包最常用的场景之一了,把数据和逻辑打包传递。

    共 2 条评论
    17
  • 海怪哥哥
    2020-06-12
    关于lambda对于外部变量的捕获。大家可以这样理解更容易,如果把lambda表达式看成一个常规的变量,那么相同作用域(比如同一个函数)内的变量跟常量对它都是可见的。

    作者回复: 这个方法不错,nice。

    
    9
  • sp0917
    2020-07-28
    罗老师, auto pfunc = &my_square; 【1】 auto pfunc = my_square; 【2】 这两种表示有什么区别? 我一直认为函数名和函数指针是对等的,所以我直觉就是使用【2】,但发现这两个在使用pfunc进行操作时效果一样。

    作者回复: 是的,一般来说函数名就相当于函数指针,但对于成员函数,就必须要加上&。 所以我习惯上总写&,看起来更清楚,也比较一致。

    
    6
  • Charles
    2020-07-24
    感觉lambda和函数指针的差别好像不是太大,可能是我还没有真正理解吧,我觉得lambda的捕获功能,普通函数也可以用传引用的方式实现?然后将函数打包到别的地方,是不是也可以把普通函数的函数指针打包到别的地方?

    作者回复: lambda的一个最核心的特点是变量,是“一等公民”,可以嵌套定义,而函数不能做到,在函数里无法定义函数,所以只能用lambda来就地定义匿名函数。

    
    4
  • robonix
    2020-06-09
    老师,lambda表达式是不是没有常量引用呢?如果怕修改被捕获的变量只能用值传递,那么就有拷贝发生了?

    作者回复: 目前的lambda是这样的,不过你可以不在[]里捕获,而是在函数参数里传递常量引用。

    
    4
  • 张JL
    2020-05-28
    我常用lambda替换函数中的小段重复代码。 相同代码重复写几遍感觉很蠢,拿出来做成函数又没有必要,因为没有其他的调用需求,这时候用lambda就简洁多了

    作者回复: 对,用lambda来封装小段代码,这就有点函数式编程的意思了。

    
    4
  • Bluebuger
    2020-06-25
    Map + lambda是个好东西 想起了以前做 虚拟机时候指令操作码处理时候的一堆case(switch语句)

    作者回复: else/switch/case是我个人认为要极力避免的,它增加了代码的复杂度,分支太多导致逻辑不清。

    
    3