- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
龙图教育:Cocos2dx3.0之Lambda表达式的使用
Cocos2dx3.0之Lambda表达式的使用在介绍3.0新的触摸机制之前,我们有必要先介绍一下3.0新引进的C++ 11的Lambda表达式。1.?Lambda表达式首先,什么是Lambda表达式呢?Lambda表达式是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的Lambda抽象,是一个匿名函数,即没有函数名的函数。相信有数学背景的孩子,现在是不是感觉到Lambda这个读音很耳熟呢?嘿嘿基本语法如下:[捕获列表](形参列表) mutable-返回值类型 复合语句其中除了“[]”(其中捕获列表可以为空)和“复合语句”(相当于具名函数定义的函数体),其它都是可选的。它的类型是唯一的具有成员operator()的非联合的类类型,称为闭包类型(closure type)。例如调用algorithm中的std::sort,ISO C++ 98 的写法是要先写一个compare函数:[cpp]? bool?compare(inta,?intb)??{?????return?ab;?//降序排序??}??然后,再这样调用:[cpp]? sort(a,?a+n,?compare);??然而,用ISO C++ 11 标准新增的Lambda表达式,可以这么写:[cpp]? sort(a,?a+n,?[](int?a,?int?b){return?ab;});?//降序排序??现在,是不是觉得代码简洁了很多呢?由于Lambda的类型是唯一的,不能通过类型名来显式声明对应的对象,但可以利用auto关键字和类型推导:[cpp]? auto?f=[](int?a,?int?b){return?ab;};??和其它语言的一个较明显的区别是Lambda和C++的类型系统结合使用,如:[cpp]? auto?f=[=](int?a,?int?b){?return?ax;});//x被捕获复制??int?x=0,?y=1;??auto?g=[](int?x){return?++y;});//y被捕获引用,调用g后会修改y,需要注意y的生存期??bool?(*fp)(int,int)=[](int?a,int?b){return?ab;});//不捕获时才可转换为函数指针??Lambda表达式可以嵌套使用。2. 在cocos2d-x 3.0中使用Lambda例如创建一个MenuItem,如果不使用Lambda,需要为这个item写一个回调函数,代码如下:[cpp]? auto?closeItem=MenuItemImage::create(??????CloseNormal.png,??????CloseSelected.png,??????CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));??[cpp]? void?HelloWorld::menuCloseCallback(Object*?sender)??{??????Director::getInstance()-end();??}??如果使用Lambda后,代码如下:[cpp]? auto?closeItem=MenuItemImage::create(??????CloseNoraml.png,??????CloseSeleceted.png,??????[](Object*?pSender)??{??????Director::getInstance()-end();?//直接在这边添加代码??});??是不是瞬间感觉到代码简洁了呢?这里还有另外一种写法,就是将回调的代码取出来,这样有一个好处就是可以多处调用callEnd。[cpp]? auto?callEnd=[](Object*?pSender)??{??????Director::getInstance()-end();?//这里直接添加代码??};????auto?closeItem=MenuItemImage::create(CloseNormal.png,CloseSelected.png,callEnd);??另外需要说的是:在默认情况下,即捕获字段为[]时,lambda表达式是不能访问外部变量的,即表达式的函数体内无法访问当前作用域下的变量。如果要设定表达式能够访问外部变量,可以在[]内写入或者=加上变量名,其中表示按引用访问,=表示按值访问,变量之间用逗号分隔,比如[=number, name]表示按值访问变量number,而按引用访问name。用引用来举个例子:假设点击按钮后,我要创建一个精灵。修改callEnd:[cpp]? auto?callEnd=[](Object*?pSender)??{??????auto?sprite=Sprite::
文档评论(0)