Cocos中C++11新特性

   Cocos2dx是用C++11编写的,由于之前工作中并没有用到这部分。这里对C++11新特性在Cocos2dx中使用较多的地方做一下归纳。

C++11FAQ:http://www.stroustrup.com/C++11FAQ.html

一、新的关键字及语法

nullptr:用来代替NULL,nullptr是强类型,防止出现一些二义性

  1. void f(int); //#1  
  2. void f(char *);//#2  
  3. //C++03  
  4. f(0); //二义性  
  5. //C++11  
  6. f(nullptr) //无二义性,调用f(char*)  

auto:根据上下文自动类型推导,(在使用STL时非常方便), (decltype与此相反,从变量或表达式中获取类型)

  1. bool AppDelegate::applicationDidFinishLaunching() {  
  2.     // initialize director  
  3.     auto director = Director::getInstance();              // Director*  
  4.     auto glview = director->getOpenGLView();              // GLView*  
  5.         ...  
  6. }  

override:派生类重写基类的虚函数时,在函数的声明中加上override(非必须), 这样可在编译时检测出对基类函数的错误重写

  1. struct B {  
  2.     virtual void f();  
  3.     virtual void g() const;  
  4.     virtual void h(char);  
  5.     void k();            // not virtual  
  6. };  
  7. struct D : B {  
  8.         void f() override;  // OK: overrides B::f()  
  9.     void g() override;  // error: wrong type  
  10.     virtual void h(char);   // overrides B::h(); likely warning  
  11.     void k() override;  // error: B::k() is not virtual  
  12. };  

final:可用来修饰基类的虚函数,表示该函数不可被派生类重写即override

  1. struct B {  
  2.     virtual void f() const final;   // do not override  
  3.     virtual void g();  
  4. };  
  5.   
  6. struct D : B {  
  7.     void f() const;     // error: D::f attempts to override final B::f  
  8.     void g();       // OK  
  9. };  

range for:只要定义了begin(), end()即有iterator

  1. void f(vector<double>& v)  
  2. {  
  3.     for (auto x : v) cout << x << '\n';  
  4.     for (auto& x : v) ++x;  // using a reference to allow us to change the value  
  5. }  

lambad表达式:主要应用时标书某些具有简单行为的函数,(cocos2dxz中常用)

  1. auto onTouchEvent = [&](EventListener* l) -> bool { // Return true to break  
  2.                 EventListenerTouchOneByOne* listener = static_cast<EventListenerTouchOneByOne*>(l);  
  3.                   
  4.                 // Skip if the listener was removed.  
  5.                 if (!listener->_isRegistered)  
  6.                     return false;  
  7.                
  8.                 event->setCurrentTarget(listener->_node);  
  9.                  ...  
  10. }  

二、标准库

1.std::function与std::bind

std::function :可以定义类似函数指针的类型

std:bind:可以方便的绑定类的成员函数

这个常在cocos2dx中的回调函数中使用

  1. std::function<void(const std::vector<Touch*>&, Event*)> onTouchesBegan;  
  2. std::function<void(const std::vector<Touch*>&, Event*)> onTouchesMoved;  
  3. std::function<void(const std::vector<Touch*>&, Event*)> onTouchesEnded;  
  4. std::function<void(const std::vector<Touch*>&, Event*)> onTouchesCancelled;  
  1. // new callbacks based on C++11  
  2. #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)  
  3. #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)  
  4. #define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)  
  5. #define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)  

2.std::thread

Cocos2dx引擎的核心仍然是一个单线程的死循环(UI线程),在处理一些比较耗时的工作,如网络通信,纹理资源,音视频资源等,为防止界面出现卡顿,最好还是另开线程(Worker线程)。而在3.2的版本中并未发现pthread的支持,原来是C++11的标准库中已经有了std::thread。下面给出一个简单示例:

  1. bool HelloWorld::init()  
  2. {  
  3.   if ( !Layer::init() )  
  4.   {  
  5.     return false;  
  6.   }  
  7.     
  8.   std::thread t1(&HelloWorld::myThread,this);//创建一个分支线程,回调到myThread函数里  
  9.   t1.join();  
  10. //t1.detach();  
  11.   
  12.   log("in major thread");//在主线程  
  13.   return true;  
  14. }  
  15.   
  16. void HelloWorld::myThread()  
  17. {  
  18.   log("in my thread");  
  19. }  

C++11中还有很多其他的新特性,如右值引用与move语义,std::move,无序容器(unordered_map...), 初始化列表等;想更深入的了解请查看c++11FAQ
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值