• 类型萃取(type traits)


    1. 类型萃取的作用

    类型萃取使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他。例如:在STL中的destory算法根据函数的参数类型的特性:是否有trivial destructor来选择对应的策略来进行destory,如果为内置类型,则不调用该类型的destructor,否则对迭代器范围内的对象调用destructor来进行destory。


    2. 函数派送

    在STL中使用类型萃取能提供一种根据类型的某些属性在编译时期进行函数派送的机制。


    例如:泛型函数destroy

    template <typename ForwardIterator>
    inline void destory(ForwardIterator first, ForwardIterator last)
    {
        __destory(first, last, value_type(first));    
    }
    
    template <typename ForwardIterator, typename T>
    inline void __destory(ForwardIterator first, ForwardIterator last, T* )
    {
        typedef typename type_traits<T>::has_trivial_destructor trivial_destructor;
        __destory_aux(first, last, trivial_destructor());
    }
    
    template <typename ForwardIterator>
    inline void __destory_aux(ForwardIterator first, ForeardIterator last, __false_type);
    
    template <typename ForwardIterator>
    inline void __destory_aux(ForwardIterator first, ForeardIterator last, __true_type);

    在最上层的destory函数通过value_type全局函数来对迭代器萃取迭代器所指向的对象的类型,然后调用__destory,该函数通过类型萃取来判断该类型是否含有trivial destructor来在编译时期进行函数派送。函数派送机制通过模板的编译机制和模板函数的重载来避免在函数代码使用if和else语句或者switch来判断是否有trivial destructor从而进行函数派送,避免了效率损失和代码的混乱。

     

    3.SGI-STL中type traits可以萃取的类型属性

    在SGI-STL中,可以萃取的类型属性如下:

    1: has_trivial_default_constructor
    2: has_trivial_copy_constructor
    3: has_trivial_assignment_operator
    4: has_trivial_destructor
    5: is_POD_type

     

  • 相关阅读:
    js设置与获取Cookie
    js,正则应用
    Ajax支持跨域之Web API实现
    RSA加密解密在jsencrypt+c#的实现-博客园加密登录
    转:sqlserver无法创建索引,超时时间已到解决办法
    【转】asp.net 项目在 IE 11 下出现 “__doPostBack”未定义 的解决办法
    c#连接SFTP上传文件
    mac 修改mysql root密码
    Vue学习手记09-mock与axios拦截的使用
    Vue学习手记08-vue-cli的启动过程
  • 原文地址:https://www.cnblogs.com/tallisHe/p/4791305.html
Copyright © 2020-2023  润新知