cocos2dx中CC_CALLBACK_N的理解

来源:互联网 发布:快压mac版 编辑:程序博客网 时间:2024/05/01 08:13
/*针对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.5std::function<void (Node* node, float a)> f3 = std::bind(&HelloWorld::callback2, this, std::placeholders::_1, 0.5);//看了上面介绍应该很好理解上面的CC_CALLBACK_N//最后简单介绍一下std::function/*std::function它是函数、函数对象、函数指针、和成员函数的包装器,可以容纳任何类型的函数对象,函数指针,引用函数,成员函数的指针。以统一的方式处理函数、函数对象、函数指针、和成员函数。允许保存和延迟执行函数。*/

0 0