• KlayGE首次引入C++11特性


    转载请注明出处为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都支持的不错,如果能好好利用,编译速度和代码质量都会有所提升。

  • 相关阅读:
    JavaScrip中构造函数、prototype原型对象、实例对象三者之间的关系
    (字符缓冲流)文本排序案例
    Annotation注解的应用(打印异常信息)
    Annotation(注解)
    Java关键技术强化
    基本数据类型与引用数据类型的区别
    EKT反射
    bootstrap的概念
    Servlet强化
    java数据库连接池
  • 原文地址:https://www.cnblogs.com/gongminmin/p/2789157.html
Copyright © 2020-2023  润新知