《STL 원본 분석 》 노트:traits 기술

3550 단어
  • 예1
    template 
    struct my_is_void
    {
        static const bool value = false;
    };
      
    template <>
    struct my_is_void
    {
        static const bool value = true;
    };
      
    cout << my_is_void::value << endl;
    cout << my_is_void::value << endl;
    
    위의 이 예는 템플릿 편특화와 클래스 정적 변수를 이용하여 유형에 대한 공형 여부를 판단하는 예이다.
  • 예 2
    template 
    void func(Iterator iter)
    {
        //                       ?
        *iter var //           。
    }
      
    //     
    template 
    void func(Iterator iter)
    {
         __func(&*iter);
    }
    
    template 
    void __func(T* ) 
    {
        T var;
    }
    
  • 예3:typetraits는 C++에서 int,bool,char 등 유형에 구조, 복사 구조 등 함수가 필요하지 않다. 우리는trivial 라고 부른다default_constructor,trivial_copy_constructor,trivial_assignment_operator,trivial_Destructor, POD 라고 합니다.type.반대로 NO 라고 합니다.POD_type.이 정의는 엄격하지 않을 수도 있지만, 오늘 이 글의 중점은 아니다.SGI STL 아래쪽에 이러한 함수가 있습니다.구조 교체기 범위 [first,last)의 원소
    template 
    inline void destory(ForwardIterator first, ForwardIterator last) 
    {
        if (is_POD_type(*first))
            ;  //   int POD_type  ,     。
        if (is_no_POD_type(*first))
            for (; first != last; first++) 
                first->~(*first)()    //       ,(*first)      。
    }  
    
    를 분석하는 것이 목적이지만 is POD type과 is no POD type 두 가지 뜻을 어떻게 표현합니까? 이럴 때 우리는 내장형과 편특화로 실현할 수 있습니다.
    //     
    struct _true_type  {  };
    struct _false_type  {  };
      
    //        POD_type
    template 
    struct _type_traits
    {  
        typedef _false_type has_trivial_default_constructor;
        typedef _false_type has_trivial_copy_constructor;
        typedef _false_type has_trivial_assignment_operator;
        typedef _false_type has_trivial_destructor;
        typedef _false_type is_POD_type;
    };
      
    // char   
    template<>
    struct _type_traits 
    {
        typedef _true_type has_trivial_default_constructor;
        typedef _true_type has_trivial_copy_constructor;
        typedef _true_type has_trivial_assignment_operator;
        typedef _true_type has_trivial_destructor;
        typedef _true_type is_POD_type;
    };
      
    // int   
    template<>
    struct _type_traits 
    {
        typedef _true_type has_trivial_default_constructor;
        typedef _true_type has_trivial_copy_constructor;
        typedef _true_type has_trivial_assignment_operator;
        typedef _true_type has_trivial_destructor;
        typedef _true_type is_POD_type;
    };
      
    ......  POD         。
    
    //        non trivaial destructor。      
    template 
    inline void destory(ForwardIterator first, ForwardIterator last) 
    {
        /*    _type_traits       */
        typedef typename _type_traits::is_POD_type is_POD_type;
        __destory_aux(first, last, is_POD_type());
    }
    
    //    trivial destructor,        
    template 
    inline void __destory_aux
    (ForwardIterator first, ForwardIterator last, _true_type) 
    {
    }
     
    //    non trivial destrouctor,  destroy
    template 
    inline void __destory_aux(ForwardIterator first, ForwardIterator last,    
    _false_type) 
    {
        for (; first != last; ++first)
            destory(&*first);
    }
    
    // destroy       
    template 
    inline void destory(T* pointer) 
    {
        pointer->~T();
    }
    
  • 예4: 교체기의 iteratortraits는 다음 글의 교체기에서 교체기 유형 추출 부분을 보십시오.
  • 좋은 웹페이지 즐겨찾기