zoukankan      html  css  js  c++  java
  • C++traits——STL源码剖析

    有时候我们希望知道迭代器所指的元素类型。

    以迭代器所指声明对象:

    template<typename Iterator, typename T>  
    void func_impl(Iterator iter, T t)  
    {  
        T temp;//这里就解决了问题  
        //这里做原本func()的工作  
    }  
      
    template<typename Iterator>  
    void func(Iterator iter)  
    {  
        func_impl(iter, *iter);//func的工作全部都移到func_impl里面了  
    }  
    

    可以通过func_impl的参数类型推导


    但是推导机制只适用于参数,无法推导返回类型

    声明内嵌型

    template<typename T>  
    class Iterator  
    {  
    public:  
        typedef T value_type;//内嵌类型声明  
        Iterator(T *p = 0) : m_ptr(p) {}  
        T& operator*() const { return *m_ptr;}  
        //...  
      
    private:  
        T *m_ptr;  
    };  
    

    特例化实现

    如果T不是一个迭代器对象,而是一个原生指针,那么内置类型不适合
    可以考虑指针特例化实现

    template<typename T>  
    class C<T*>   
    {  
        //...   
    };  
    

    traits萃取机

    tempalte<typename I>  
    struct iterator_traits  
    {  
        typedef typename I::iterator_category iterator_category;  
        typedef typename I::value_type value_type;  
        typedef typeanme I:difference_type difference_type;  
        typedef typename I::pointer pointer;  
        typedef typename I::reference reference;  
    };  
    
    //通过iterator_traits作用后的版本  
    template<typename Iterator>  
    typename iterator_traits<Iterator>::value_type  //这行是返回类型  
    func(Iterator iter)  
    {   
        return *iter;  
    }  
    
  • 相关阅读:
    一本通 1602:烽火传递
    【笔记】Correlation & Convolution
    【笔记】Supreme Axiom → Heine-Borel Theorem
    CCPC2017
    【BZOJ3513】idiots
    【AGC030D】Inversion Sum
    【Gym102823H】Hamming Distance
    CCPC2018
    【ZJOI2014】力
    【Luogu3803】模板:多项式乘法
  • 原文地址:https://www.cnblogs.com/Przz/p/6590959.html
Copyright © 2011-2022 走看看