您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx中CC_CALLBACK_N的理解

2016-03-31 11:54 513 查看
/*针对cocos2d-x CC_CALLBACK_N的使用介绍*/
//首先看一下cocos2dx中的源码
// new callbacks based on C++11
#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__)

//CC_CALLBACK_N是一些宏定义,这里是用到了std::bind,所以我们介绍一下std::bind
/*std::bind绑定器
std::bind用来将可调用对象与其参数一起进行绑定。绑定后的结果可以使用std::function进行保存,并延迟调用到任何我们需要的时候。通俗来讲,它主要有两大作用:
  1).将可调用对象与其参数一起绑定成一个仿函数。
  2).将多元(参数个数为n,n>1)可调用对象转成一元或者(n-1)元可调用对象,即只绑定部分参数。
  function模板类和bind模板函数,都可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函数时。
  1).std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别)。
  2).绑定到类的非静态成员函数,则需要使用std::bind。*/

//这里介绍一下std::bind的用法
//绑定全局或静态函数
std::function<void(int)> f1 = std::bind(func, std::placeholders::_1);     //func是一个全局或静态函数
//绑定带参数的成员函数
//ReadHandler::ConnectPreProcess是成员函数,所以第二个参数传入是this指针,来绑定对象,要知道成员函数和普通函数的区别在于是否含有this指针
std::function<void (char*, int)> f2 = std::bind(ReadHandler::ConnectPreProcess, this, std::placeholders::_1, std::placeholders::_2);
//接着介绍一下std::placeholders::_1是不定参数,这个好比占位符
//就是说明f1中的参数,现在不指定,调用的时候再传入

//最后理解##__VA_ARGS__(可变参数列表)看一下下面这个函数应该很好理解
//这个就表示现在要传入的参数列表,并且可以传多个(上面用...表示)
//参数node现在不定,需要调用时候传入,参数a现在传入0.5
std::function<void (Node* node, float a)> f3 = std::bind(&HelloWorld::callback2, this, std::placeholders::_1, 0.5);

//看了上面介绍应该很好理解上面的CC_CALLBACK_N

//最后简单介绍一下std::function
/*std::function
它是函数、函数对象、函数指针、和成员函数的包装器,可以容纳任何类型的函数对象,函数指针,引用函数,成员函数的指针。
以统一的方式处理函数、函数对象、函数指针、和成员函数。允许保存和延迟执行函数。
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: