Cocos2d-x回调函数 Lambda表达式

来源:互联网 发布:白菜价是淘宝开的吗 编辑:程序博客网 时间:2024/05/19 06:15

参考http://zh.wikipedia.org/wiki/C%2B%2B11#Lambda.E5.87.BD.E5.BC.8F.E8.88.87.E8.A1.A8.E7.A4.BA.

http://baike.baidu.com/link?url=ip5P-8vQcbMDUkPnCV6BdP0JcSPqk-NfVBdB3-EwS7LL3Y8vUZ_XDMk1C9RVTE2seg8JJ4L2UIdQRqbInxs5iK#3

https://msdn.microsoft.com/zh-cn/magazine/cc163362.aspx

Cocos2d-x的源码里有很多

auto item2 = MenuItemFont::create("--- Go Back ---", [&](Ref *sender) {
   static_cast<LayerMultiplex*>(_parent)->switchTo(0);
});


auto item3 = MenuItemSprite::create(spriteNormal, spriteSelected, spriteDisabled, [](Ref *sender) {
log("sprite clicked!");
});


这种类型的代码。

从create函数的函数声明里,我们可以看到【】和【&】这些代码所在的地方是回调函数所在的地方。

其实这是C++11新引入的一种语法,叫做Lambda表达式。

而在C++98中,我们的回调函数是要这么设置的,

boolcompare(int&a,int&b)//先定义比较函数
{
returna>b;//降序排序
}
sort(a,a+n,compare);//再调用


现在又了新增的Lambda语法标准:

我们可以

sort(a, a+n, [](int a, int b){return a > b;});

是不是简洁很多,看了Lambda的好处。下面详细了解下Lambda

C++中,一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。它与普通函数不同的是,lambda必须使用尾置返回来指定返回类型。

由于Lambda的类型是唯一的,不能通过类型名来显式声明对应的对象,但可以利用auto关键字和类型推导:

auto f=[](inta,intb){returna>b;});

我们注意到 Lambda表达式的前面有个[]里面有时有&有时没有,是怎么回事?


[]// 沒有定義任何變數。使用未定義變數會導致錯誤。

[x,&y]// x以傳值方式傳入(預設),y以傳參考方式傳入。

[&]   // 任何被使用到的外部變數皆隱式地以參考方式加以引用。[=]   // 任何被使用到的外部變數皆隱式地以傳值方式加以引用。[&, x]   // x顯示地以傳值方式加以引用。其餘變數以參考方式加以引用。[=, &z]   // z顯示地以參考方式加以引用。其餘變數以傳值方式加以引用。
我们注意到 有&的表达式里都引用了外部变量,相反没有引用外部变量的就没有&。

在新的C++14标准中,还支持基于类型推断的泛型表达式.

sort(a,a+n,[](const auto&a,const auto&b){return a>b;});//降序排序:不依赖a和b的具体类型


好处是:

因为参数类型和函数模板参数一样可以被推导而无需和具体参数类型耦合,有利于重构代码;和使用auto声明变量的作用类似,它也允许避免书写过于复杂的参数类型。特别地,不需要显式指出参数类型使使用高阶函数变得更加容易。

0 0
原创粉丝点击