我理解的lambda表达式(匿名闭包函数)
[] 第一个方括号是捕获列表,可以捕获外部变量的值或者地址,如果想要利用闭包函数修改外部变量的值,则需要传入该值的地址,可以使用指针或者引用符& 。
() 弧括号是函数的形参列表。
{} 大括号是函数体,可以对捕获到的值进行修改,返回值由编译器自动推断,如果需要定义返回值的话,要在大括号前面指明返回值类型,如 []() ->bool {return true}; 。
而cocos2d::addClickListener()的形参为下面这个函数的地址:
c++模板函数std::function<void(cocos2d::Ref*)> &callback
即,命名一个callback函数,并取其地址。该callback函数的实参必须是cocos2d::Ref*类型,返回值必须是void。
那么我们想要添加点击按钮触发的事件,
则必须自己在类里面声明一个callback回调函数来调用,然后把相关的事件定义到callback函数体里。
这样太麻烦了。c++11开始引入了lambda表达式,可以在调用处按照callback函数的格式直接定义一个匿名函数,即没有函数名,所以省去了繁琐的声明定义然后再调用的过程。
lambda表达式还有一个好处就是,她可以通过捕获列表引用外部类作用域成员的值,如果被std::function模版化命名后,新的命名函数也依然可以引用该值和修改该值。