zoukankan      html  css  js  c++  java
  • 类型萃取(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

     

  • 相关阅读:
    用于 webpack 打包后方便修改的配置文件
    antd 中对树形表格中二级元素进行筛选过滤
    layui快速搭建一个后台管理系统
    centos使用shell定时清空缓存
    内存异常原因查询
    Protocol "‘https" not supported or disabled in libcurl
    HTML table标签实现表头固定
    vue 查询某个对象在对象列表的索引位置
    vue 实现页面监听键盘按键 上下左右
    Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能
  • 原文地址:https://www.cnblogs.com/tallisHe/p/4791305.html
Copyright © 2011-2022 走看看