转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2121
在KlayGE开发版中,C++11的部分特性第一次被采用。目前用到的有两处,nullptr和强类型enum。所有这些C++11 only的代码都被放入#ifdef /#endif,同时提供了非C++11的替代实现。
nullptr
nullptr是C++11定义的强类型空指针,用来取代NULL。强类型的保证减少了bug的可能性,相关的介绍很容易找到,这里就不累赘了。在不支持C++11的编译器上,也可以实现一个同样功能的nullptr:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | const class nullptr_t { public: template <typename T> operator T*() const { return reinterpret_cast<T*>(0); } template <typename C, typename T> operator T C::*() const { return reinterpret_cast<T C::*>(0); } private: void operator&() const; } nullptr = {}; |
强类型enum
目前只有ElementFormat用到了强类型enum。ElementFormat表示了KlayGE的图形子引擎会用到的各种元素格式,包括pixel格式和vertex格式。原先ElementFormat是定义成uint64_t的typedef,因为32-bit不够放。这引发的一个问题是调试的时候看到的是数,不是enum的名字,带来了诸多不便。用C++11的强类型enum可以解决这个问题:
1 2 3 4 | enum ElementFormat : uint64_t { ... } |
需要注意的是,vc10虽然支持部分C++11特性,但把强类型enum作为一个非标准扩展,在使用的时候会出现一个warning。而且它不支持声明成64-bit的类型。所以只有vc11才能用上这个特性。
总结
这次引入C++11的特性,没有增加新的功能,但提升了库的体质。在以后的几个版本里,KlayGE会会逐渐引入更多C++11的特性,并在支持C++11的编译器上减少对boost的使用(目前用到的boost子库列表在这里)。不是说boost不好,而是因为最近几年,各种平台不断出现,每一次移植新平台,总得面临boost的移植,无谓的耗费了很多时间。好在新平台的编译器对C++11都支持的不错,如果能好好利用,编译速度和代码质量都会有所提升。