zoukankan      html  css  js  c++  java
  • c++ STL __type_traits<T>解释

    今天看《STL源码剖析》,突然看到一个叫__type_traits<T>的名词。

    当容器进行范围destoy的时候,其函数接受first和last的迭代器,若[first,last)范围内所有的元素都调用析构函数,但这个类型T的析构又是无关痛痒的,则会损耗效率。  __type_trais<T>可以判别该类型T的的析构函数是否无关痛痒,若是(__true_type),则什么都不做,否则调用其析构函数。

    STL的destroy函数原型:

    步骤解释:

    1.首先容器触发destroy(Iterator first, Iterator last)

    2.value_type(first)取得容器当前存储的类型T*,然后调用__destroy(Iterator first, Iterator last, T*)

    3.在__destroy函数里, 利用typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor, 判断类型T的析构是否存在特性,并调用__destroy_aux,传入trivial_destructor

    (若类型T是无特性的,其会定义typedef __true_type has_trivial_destructor, 否则定义typedef __false_type has_trivial_destructor)

    4.若存在特性,则会调用到__destroy_aux(Iterator, Iterator, __false_type), 并逐一对[first, last)范围内的元素进行析构

    5.若不存在特性,则会调用到__destroy_aux(Iterator, Iterator, __true_type), 并什么都不做

    ps:更具体的理解可以看看http://blog.csdn.net/sanlongcai/article/details/1786647     该博文浅显地讲出了type trait的概念,而其测试代码也很容易懂。

    此处顺便记录下本人对上述博文的测试代码的修改测试,供日后回味。 :)

     1 #ifndef TEST_CLASS_H
     2 #define TEST_CLASS_H
     3 
     4 #include <iostream>
     5 using std::cout;
     6 using std::endl;
     7 
     8 class TestClass
     9 {
    10 public:
    11     TestClass()
    12     {
    13         cout << "TestClass constructor call" << endl;
    14         data = new int(3);
    15     }
    16     TestClass(const TestClass& test_class)
    17     {
    18         cout << "TestClass copy constructor call. copy data:"
    19             << *(test_class.data) << endl;
    20         data = new int;
    21         *data = *(test_class.data) * 2;
    22     }
    23     ~TestClass()
    24     {
    25         cout << "TestClass destructor call. delete the data:" << *data << endl;
    26         delete data;
    27     }
    28 private:
    29     int *data;
    30 };
    31 
    32 #endif
    TestClass.h
     1 // my_type_traits.h开始
     2 #ifndef MY_TYPE_TRAITS_H
     3 #define MY_TYPE_TRAITS_H
     4 
     5 //#include "test_class.h"
     6 
     7 struct my_true_type {
     8 };
     9 
    10 struct my_false_type {
    11 };
    12 
    13 template <class T>
    14 struct my_type_traits
    15 {
    16     typedef my_false_type has_trivial_destructor;
    17 };
    18 
    19 template<> struct my_type_traits<int>
    20 {
    21     typedef my_true_type has_trivial_destructor;
    22 };
    23 
    24 //template<> struct my_type_traits<TestClass>
    25 //{
    26 //    typedef my_true_type has_trivial_destructor;
    27 //}; //若删除对TestClass的注释,则TestClass将会被定义成没有特性的析构的类
    28 
    29 #endif
    30 // my_type_traits.h结束
    my_type_traits.h
     1 // my_destruct.h开始
     2 #ifndef MY_DESTRUCT_H
     3 #define MY_DESTRUCT_H
     4 #include <iostream>
     5 
     6 #include "my_type_traits.h"
     7 
     8 using std::cout;
     9 using std::endl;
    10 
    11 template <class T1, class T2>
    12 inline void myconstruct(T1 *p, const T2& value)
    13 {
    14     new (p) T1(value);
    15 }
    16 
    17 template <class T>
    18 inline void mydestroy(T *p)
    19 {
    20     typedef typename my_type_traits<T>::has_trivial_destructor trivial_destructor; //此处获得类型T是否没有特性析构
    21     _mydestroy(p, trivial_destructor()); 
    22 }
    23 
    24 template <class T>
    25 inline void _mydestroy(T *p, my_true_type)
    26 {
    27     cout << " do the trivial destructor " << endl;
    28 }
    29 
    30 template <class T>
    31 inline void _mydestroy(T *p, my_false_type)
    32 {
    33     cout << " do the real destructor " << endl;
    34     p->~T();
    35 }
    36 
    37 #endif
    38 // my_destruct.h结束
    my_destruct.h
     1 #include "test_class.h"
     2 #include "my_destruct.h"
     3 
     4 int main(void)
     5 {
     6     {
     7         TestClass *test_class_buf;
     8         TestClass test_class;
     9 
    10         test_class_buf = (TestClass *)malloc(sizeof(TestClass));
    11         myconstruct(test_class_buf, test_class);
    12         mydestroy(test_class_buf);
    13         free(test_class_buf);
    14     }
    15 
    16     {
    17         int *int_p;
    18         int_p = new int;
    19         mydestroy(int_p);
    20         free(int_p);
    21     }
    22 }
    main.cpp

    该图是当my_type_traits.h中对TestClass的has_trivial_destructor定义为__true_type的语句注释后的结果

    这是利用了偏特化(Partial Specialization)的做法

    下图则是未注释的结果

  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/elenno/p/type_traits.html
Copyright © 2011-2022 走看看