Cocos2d-x回调函数 Lambda表达式
Cocos2d-x的源码里有很多
auto item2 = MenuItemFont::create(--- Go Back ---, [&](Ref *sender) {
static_cast
});
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声明变量的作用类似,它也允许避免书写过于复杂的参数类型。特别地,不需要显式指出参数类型使使用高阶函数变得更加容易。
相关新闻>>
- 关于cocos2dx lua中的clone函数的源码解读
- Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2
- Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗
- Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3
- Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色按路径行走
- 结合cocos2d-x开发配置sublime text
- cocos2d-x开发: 如何从项目中分离出接口范例
- cocos2d-x在iOS/Android双平台上嵌入WebView
- Cocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走
- 发表评论
-
- 最新评论 更多>>