【C++】C++11新特性 之 lambda表达式的使用
这样一来,代码是不是简洁多了呢?
使用了lambda后,可以这么使用: 这种写法是不是简洁很多?当然了,也可以将回调 的代码单独取出来,这种写法的好处是可以多出调用callEnd。如下:
上面这种写法是错误的,因为表达式无法访问当前作用于的变量。下面继续改代码: 这样就没问题了。
发布日期:2021-06-28 22:16:21
浏览次数:2
分类:技术文章
本文共 2700 字,大约阅读时间需要 9 分钟。
Cocos2dx 3.0 版本后加入了lambda表达式,或者说C++ 11终于引入了lambda表达式,那么,什么是lambda表达式呢?
例如调用<algorithm>中的std::sort,ISO C++ 98 的写法是要先写一个compare函数:
- bool compare(int & a, int & b)
- {
- return a > b; // 降序排序
- }
- 调用:
- sort(a, a+n, compare);
- sort(a, a + n, [](int a, int b){ return a > b;}); // 降序排序
由于Lambda的类型是唯一的,不能通过类型名来显式声明对应的对象,但可以利用auto关键字和类型推导:
- auto f = [](int a, int b){ return a > b;});
下面讲下在cocos2dx 3.0 应该如何使用lambda:
我先创建一个menu ,如果不使用labmda,menu里 item 需再写一个回调函数,如下:
- auto closeItem = MenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
- void HelloWorld::menuCloseCallback(Object* sender)
- {
- Director::getInstance()->end();
- }
- auto closeItem = MenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- [](Object* sender)
- {
- Director::getInstance()->end();//直接在这里添加按钮要调用的代码
- });
- auto callEnd = [](Object* sender)
- {
- Director::getInstance()->end();//直接在这里添加按钮要调用的代码
- };
- auto closeItem = MenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- allEnd);
默认情况下,即捕获字段为 [] 时,lambda表达式是不能访问任何外部变量的,即表达式的函数体内无法访问当前作用域下的变量。 如果要设定表达式能够访问外部变量,可以在 [] 内写入 & 或者 = 加上变量名,其中 & 表示按引用访问,= 表示按值访问,变量之间用逗号分隔,比如 [=factor, &total] 表示按值访问变量 factor,而按引用访问 total。
用 & 引用来举个例子:假设点击按钮后,我要创建一个精灵。修改callEnd:
- auto callEnd = [](Object* sender)
- {
- auto sp = Sprite::create("Hello.png");
- sp->setPosition(Point(100,100));
- this->addChild(sp,10);//这里报错
- };
- auto callEnd = [&](Object* sender)
- {
- auto sp = Sprite::create("Hello.png");
- sp->setPosition(Point(100,100));
- this->addChild(sp,10);//perfect
- };
上面的例子都只是简单的应用。在cocos2dx用到lambda 的地方还有很多,例如创建一个监听事件:
[cpp] // Make sprite1 touchable auto sprite1 = Sprite::create(); auto listener1 = EventListenerTouchOneByOne::create(); listener1->setSwallowTouches(true); listener1->onTouchBegan = [](Touch* touch, Event* event){ auto target = static_cast(event->getCurrentTarget()); return false; }; listener1->onTouchMoved = [](Touch* touch, Event* event){ auto target = static_cast (event->getCurrentTarget()); target->setPosition(target->getPosition() + touch->getDelta()); }; listener1->onTouchEnded = [=](Touch* touch, Event* event){ auto target = static_cast (event->getCurrentTarget()); }; _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);
转载地址:https://blog.csdn.net/yhhwatl/article/details/22578111 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月26日 12时54分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
在bootstrap中实现treeview
2019-04-29
DBGrid 根据表格中数据长度自动调整表格宽度
2019-04-29
delphi中遍历枚举类型的方法
2019-04-29
Delphi 遍历类中的属性
2019-04-29
jsTree发现一个比较好的树形结构
2019-04-29
C#连接MariaDB
2019-04-29
ajax上传大文件
2019-04-29
Android版本和API Level对应关系
2019-04-29
delphi 查找指定目录,指定扩展名的所有文件名
2019-04-29
介绍两款绘图软件免费的
2019-04-29
怎么样使用delphi 中的statusbar控件改变文字颜色
2019-04-29
sql server 2005 自动重新建立索引
2019-04-29
Android Socket开发
2019-04-29
Opencvsharp 读取摄像头,图片叠加
2019-04-29
C#使用OpenCVSharp实现图片的美白
2019-04-29
自己写的前端验证
2019-04-29
Android调用Webview中的js方法
2019-04-29
在StringList中增加类对象!
2019-04-29