cocos2dx的CC_CALLBACK是个什么宏
先来看源码CC_CALLBACK_1的定义,其他的一次类推。 #define CC_CALLBACK_1(__selector__,__target__,...)
std::bind(&__selector__,__target__,std::placeholders::_1,##__VA_ARGS__)
int functionA (int a,int b) //定义functionA函数,有两个参数
{
return a+b;
}
//用std::function定义functionB函数,稍后介绍这个
std::function<int(int,int)> functionB;
//用bind绑定functionA和functionB,_1表示输入到第一个参数里,_2是第二个
functionB = std::bind(functionA,std::placeholders::_1,std::placeholders::_2);
functionB(1,2)//等同于functionA(1,2)
functionB = std::bind(functionA,std::placeholders::_2,std::placeholders::_1);//注意_1和_2换了位置
functionB(1,2)//等同于functionA(2,1),即把“1”按functionA中
//的第二个参数传入,“2”按functionA中第一个参数传入
//以上是函数,如在类里面用的话定义如下,类名为HelloWorld
functionB = std::bind(
&HelloWorld::functionA,this,std::placeholders::_1);
简单地说bind就是绑定两个函数,当调用functionB时就相当于调用了functionA,而_1、_2、_3等等是按functionA中参数顺序排列的。这个是游戏场景之间子场景向上一级的场景传递消息时会用到,即反向传值,会在以后的学习中跟大家分享。
std::function<int(int,char)> fun;
fun = [](int a,char b){
return a+b;
};
( )中间是参数,{ }中间就是函数体,[ ]中间的参数表示捕获变量。其中,中括号中的参数我目前只用到过这种情况,就是我要在函数体里面调用该类的全局变量就要把这个全局变量写进去,否则无法调用。如在coco2dx中你要在你的lambda表达式中用到本层this指针式就得把this写进去,如下代码: std::function<int(int,char)> fun;
//////////////////正确////////////////
fun = [this](int a,char b){//把this写进去,全局变量也要写进去否则也不能用
....
this->addChild(一个精灵);
....
return a+b;
};
//////////////////错误////////////////
fun = [](int a,char b){//没有写this
....
this->addChild(一个精灵);
....
return a+b;
};
总结:为什么要这么定义,就我目前看到的这个是为了便于数据之间的相互传递。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |