转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2158

昨天比较完各编译器对C++11的支持,决定一蹴而就,继续引入几个不影响接口的C++11语言核心特性。于是选了type traits、static assert、range-based for和decltype。前三个都好办,用个宏包起来,在不支持C++11的编译器上切换回Boost的实现。只有decltype是需要特别注意的。

BOOST_TYPEOF也能实现类似decltype的功能,比如有一个vector<int> v,typedef BOOST_TYPEOF(v) VType;,那么VType就是vector<int>了。但如果v是vector<int>&,BOOST_TYPEOF(v)得到的是vector<int>,而decltype(v)得到的是vector<int>&。如果要接着把VType用作别的用途,比如通过VType::reference得到int&,这两者就会有区别了。所以需要用type traits里的remove_reference来去掉引用,得到和BOOST_TYPEOF一致的结果。

所有引入的C++11特性都可以在KlayGE/Core/Include/KlayGE/Type.hpp里面找到。修改以后完全编译KlayGE Core的平均速度从2分20秒加速到了2分……17秒。。。好吧,毕竟没那么多用到了那些特性的地方,能加速一点点也算不亏了。