[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::function 
class 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