转载请注明出处为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
const class nullptr_t
{
public:
template
operator T*() const
{
return reinterpret_cast(0);
}

template
operator T C::*() const
{
return reinterpret_cast(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都支持的不错,如果能好好利用,编译速度和代码质量都会有所提升。