[cocos2d-x3.x学习笔记]lambda表达式 std::function CC_CALLBACK_ 事件回调实现

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 pf2 = [](){}; //可以赋值给std::function

	lab1();
	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 onTouchBegan;
    std::function onTouchMoved;
    std::function onTouchEnded;
std::function onTouchCancelled;
用法示例:

#include 
#include  
using namespace std;
#define END cout<<"按任意键继续..."< p1 = &f3; //全局函数
	std::function p2 = &A::f2;//类静态成员函数
	p1(1);
	p2();
	//std::function p2 = &A::f1; //编译错误,非静态必须实例化
	A *a = new A;
	//std::bind()来绑定非静态成员函数,std::placeholders参数占位符
	std::function 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>类非静态成员函数

你可能感兴趣的:(cocos2d-x)