[cocos2d-x3.x学习笔记]lambda表达式 std::function CC_CALLBACK_ 事件回调实现
来源:互联网 发布:网络推广的目的和意义 编辑:程序博客网 时间:2024/05/22 03:38
lambda表达式:
形式:[] () mutable throw() -> int {}捕获列表 参数列表 捕获变量是否可以修改 异常 返回类型 函数体
捕获列表:捕获当前函数体的变量 =值[默认] &引用
示例:
int a = 0, b = 1;auto lab1 = [=](){ cout << a << b << endl; };auto lab2 = [&a](){ a = 2; }; //引用捕获,修改值成功//auto lab3 = [=]() { b = 3; }; //编译错误 b不可修改auto lab3 = [=]() mutable { b = 3; }; //复制捕获,修改值不成功auto lab4 = [&] { int temp = b; b = a; a = temp; }; //简写形式auto lab5 = [&a, &b](void) mutable throw() -> void { int temp = b; b = a; a = temp; }; //非简写形式void(*pf1)(void) = [](){}; //可以赋值给函数指针std::function<void(void)> pf2 = [](){}; //可以赋值给std::functionlab1();lab2();cout << a << b << endl;lab3();cout << a << b << endl;lab4();cout << a << b << endl;lab5();cout << a << b << endl;
输出结果:
01
21
21
12
21
std::function,std::bind,std::placeholders:
事件监听类用的是std::functionclass EventListenerTouchOneByOne
std::function<bool(Touch*, Event*)> onTouchBegan;
std::function<void(Touch*, Event*)> onTouchMoved;
std::function<void(Touch*, Event*)> onTouchEnded;
std::function<void(Touch*, Event*)> onTouchCancelled;
用法示例:
#include <iostream>#include <functional> using namespace std;#define END cout<<"按任意键继续..."<<endl;getchar();return 0class A{public:/*类非静态成员函数*/int f1(int); /*类静态成员函数*/static void f2(void);};int A::f1(int i){cout << i << endl;return 0;}void A::f2(void){cout << "2" << endl;}/*全局函数*/int f3(int i){cout << i << endl; return 0;}int main(){std::function<int(int)> p1 = &f3; //全局函数std::function<void(void)> p2 = &A::f2;//类静态成员函数p1(1);p2();//std::function<int(int)> p2 = &A::f1; //编译错误,非静态必须实例化A *a = new A;//std::bind()来绑定非静态成员函数,std::placeholders参数占位符std::function<int(int)> p3 = std::bind(&A::f1, a, std::placeholders::_1);//类非静态成员函数p3(3);delete a;END;}
CC_CALLBACK_:
根据宏定义,就是std::bind,最后的数字代表函数参数占位符#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)
所以实现cocos2d-x事件回调就有3种方法
<1>推荐使用lambda表达式,代码清晰易读,减少代码量,易于优化。<2>全局函数/类静态成员函数
<3>类非静态成员函数
0 0
- [cocos2d-x3.x学习笔记]lambda表达式 std::function CC_CALLBACK_ 事件回调实现
- cocos2d-x-3.0学习笔记之std::function、std::bind
- cocos2d-x3.x 事件监听笔记
- Cocos2d-x回调函数 Lambda表达式
- C++11 std::function用法(对cocos2d-x 3.2 中lambda的部分认识)
- 有效使用 Lambda 表达式和 std::function
- C++11中的std::function,Lambda表达式
- cocos2d-x学习笔记——cocos2d-x3.0回调函数的变化
- Cocos2d-x3.x笔记目录
- [cocos2d-x3.x学习笔记]坐标系 锚点 Z值
- Cocos2d-x3.X版本事件注册方法
- cocos2d-x 3.3 CC_CALLBACK_0 std::bind与std::function
- lambda, std::function, std::bind
- cocos2d-x学习笔记(11)回调CallFunc,lambda
- Cocos2d-x事件分发机制学习笔记
- Cocos2d-x 3.1.1 学习日志5--cocos2d-x3.1.1打飞机的实现
- Lambda表达式学习笔记
- Cocos2d-x开发实例:使用Lambda 表达式
- 黑马程序员——黑马学习日志之二 Java基础02
- UITableView
- swift 数据类型
- curl发送请求时出现Warning: curl_error(): 2 is not a valid cURL handle resource错误
- 【iOS开发】 UITableView 理解与应用
- [cocos2d-x3.x学习笔记]lambda表达式 std::function CC_CALLBACK_ 事件回调实现
- 3-1. 三天打鱼两天晒网(15)
- ZOJ-1167
- C++ =赋值运算符的重载
- UIViewController各方法的调用顺序
- 查找一个字符串的子字符集
- 建立android全局异常捕获类
- XP画图板版本1
- 希腊字母读音表