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;  
    }  
    
  • 相关阅读:
    Arrays.asList的使用
    php之sql语句 创建数据库、表、插入字段,自动判断是否成功
    初识 canvas 绘图
    自定义音频audio播放器
    我的晨练
    js获取屏幕或可视范围
    js 查看脚本运行时间的办法
    a:hover伪类在ios移动端浏览器内触发无法取消
    js模拟用户触摸事件
    持续健身带来的变化
  • 原文地址:https://www.cnblogs.com/Przz/p/6590959.html
Copyright © 2011-2022 走看看