Cocos2d-x回调函数 Lambda表达式

参考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声明变量的作用类似,它也允许避免书写过于复杂的参数类型。特别地,不需要显式指出参数类型使使用高阶函数变得更加容易。

时间: 2024-07-30 13:34:32

Cocos2d-x回调函数 Lambda表达式的相关文章

Python匿名函数——lambda表达式

如果要定义的函数很简单,一个return语句就能搞定,可以使用lambda表达式来定义, lambda表达式的语法如下: lambda parameters: expression lambda表达式并不包含return语句,凡是使用函数作为参数或返回值的地方,都可以使用lambda表达式,lambda函数的好处有: 简便,顺手 可以不给函数起名字,某些不需要重用该函数的地方,实质上不需要给函数想一个名字 下面的例1将lambda表达式定义的函数作为内置函数filter的参数, 例1. 将lam

C++11中的匿名函数 lambda函数 lambda表达式

这篇文章是根据维基百科整理来的,原文请看:http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下: [capture](parameters)->return-type{body} 如果没有参数,空的圆括号()可以省略.返回值也可以省略,如果函数体只由一条return语句组成或返回类型为void的话.形如:   [captur

【Unity|C#】基础篇(9)——匿名函数/Lambda表达式

[学习资料] > 在线文档 官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/ 菜鸟教程(高级教程):https://www.runoob.com/csharp/csharp-tutorial.html > 视频教程 腾讯学院.Siki学院         > 书籍 <C#图解教程>(第13章):https://www.cnblogs.com/moonache/p/7687551.html [学习内容] > 菜鸟教程

cocos2d 动作回调函数

// on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); C

python — lambda表达式与内置函数

目录 1 lambda表达式 (匿名函数) 2 内置函数 1 lambda表达式 (匿名函数) 用于表示简单的函数 lambda表达式,为了解决简单函数的情况: def func(a1,a2): =====> func = lambda a1,a2:a1+a2 # 函数直接得到返回值,这里隐藏了return return a1+a2 简化 # 三元运算,为了解决简单的if else的情况,如: if 1 == 1: a = 123 else: a = 456 a = 123 if 1 == 1

【Cocos2d-x 3.0 基础系列一】 各类回调函数写法汇总

一.button回调 1. Lambda 表达式,C++11 Lambda 赋予了Cocos2d-x 3.0创建回调函数的灵活性. auto itemNor = Sprite::create("CloseNormal.png"); auto menuItem = MenuItemSprite::create(itemNor,nullptr,nullptr,[](Ref* sender) { log("show this msg."); }); auto menu =

Cocos2d-x 3.0 回调函数

一.按钮回调 1. Lambda 表达式,C++11 Lambda 赋予了Cocos2d-x 3.0创建回调函数的灵活性. [cpp] view plaincopy auto itemNor    =   Sprite::create("CloseNormal.png"); auto menuItem   =   MenuItemSprite::create(itemNor,nullptr,nullptr,[](Ref* sender) { log("show this ms

lambda 表达式

英标:['læmd?],汉语音:蓝达 Lambda 是用来创建匿名函数 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数.通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.Lambda 表达式对于编写 LINQ 查询表达式特别有用. 一.委托中使用 Lambda  delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; i

30天C#基础巩固----Lambda表达式

     这几天有点不在状态,每一次自己很想认真的学习,写点东西的时候都会被各种小事情耽误,执行力太差.所以自己反思了下最近的学习情况,对于基础的知识,可以从书中和视频中学习到,自己还是需要注意下关于自己以前做的项目中的一些知识点,那些才是HR提问的关键所在.今天都6.4号了,时间过的真是快呀,学校7.18左右放假,自己打算去西安看看,能不能找到一个实习工作,不行的话只能等到大四的第一学期去走校招.可以我们大四的第一学期还有很多课,真不知道老师是如何想的.所以在这还剩不到快2个月的时间里,把自己