• 谈谈C++ STL的Traits设计上的理解


      这两天看了<<STL源码解析>>,谈谈自己对traits的一点理解吧.

      C++中类几类结构同时由一个父类派生出来,而他们都拥有一个设计接口上相同的属性,而在实现上却有细节上的不同.这时,为了在通用算法中将他们整合在一起,就产生了traits的设计,traits的汉语意思为特性.

      举个例子,比如我们设计一个共同的属性叫value_type,对于不同的迭代器通用的一个属性.如vector_iterator<int>的value_type为int,vector_iterator<A>的value_type为A.

      函数f1的参数要是一个value_type,可以利用模板,

      template<typename T>

      void f1(T t){

        .........

      }

      利用模板参数t传到函数中去,但如果T的类型为const int,我们想传入一个int类型的参数时,这种方法也是不行的.

      因此就产生了traits的设计,利用traits提供于特性的榨取.

      比如,函数f1要返回一个value_type的对象.

    template<class I>
    struct test_list_iterator{
        typedef I value_type;
        value_type
    * pos;
        value_type 
    operator*(){
            
    return *pos;
        }
        test_list_iterator(I
    * p){
            
    this->pos=p;
        }
    };
      我们设计一个简单的迭代器结构,用value_type来表示迭代器所指向值的类型.
      为了对value_type进行榨取,我们设计了test_iteratora_traits
    template<class I>
    struct test_iterator_traits{
        typedef typename I::value_type value_type;
    };
      同时,由于简单类型int没有value_type的定义,const Type的value_type应该取成Type而不是const Type,因此,利且模板的偏特化,对test_iterator_traits进行偏特化.
    //偏特化版本
    template<class I>
    struct test_iterator_traits<I*>{
        typedef I value_type;
    };
    template
    <class I>
    typename test_iterator_traits
    <I>::value_type
    f(I ite){
        
    return *ite;
    }
     
        假如函数f2要返回一个value_type的对象,如下:
    template<class I>
    typename test_iterator_traits
    <I>::value_type
    f(I ite){
        
    return *ite;
    }

      测试的main函数如下:

    int main(){
        
    int a=1;
        
    int* pa=&a;
        test_list_iterator
    <int> ita(pa);
        cout
    <<f(pa)<<endl;
        cout
    <<f(ita)<<endl;
    }
    小人本潜水在思源的贴边
    ID又多 又有钱
    快活乐无边
    谁知道站总监
    他蛮横不留情面
    他勾结站长目无天
    占我ID夺我钱
    我马甲跟他来翻脸
    反被他来把经验减
    我同学骂他欺新人
    反被他捉进了小黑屋里面
    874了一百遍啊一百遍
    啊 最后他咬舌自尽 遗恨人间
    他还将我和马甲赶出了思源 流落在人间
    我为求回思源
    无奈行乞在贴前
    谁知道站总监他实在太阴险
    知道此情形竟派人来暗算将我发文狂删到0篇
    小人ID强 残命独留全
    可怜马甲他 竟遭删
    为求养ID
    惟有傍人卖身自作践
    一面苦赚钱 一面写诗篇
    发誓把名气显
    手刃总监意志坚啊
    从此总监ID念心间
    我永铭记此仇不供戴天
  • 相关阅读:
    windows快速安装redis
    Tensorflow教程(3)什么是张量?什么是数据流图?
    Tensorflow教程(2)Tensorflow的常用函数介绍
    Tensorflow教程(1)Tensorflow的下载和安装
    oracle获取当天时间的最开始的时间和最结尾的时间
    kindeditor在线文本编辑器过滤HTML的方法
    用PHP抓取淘宝商品的用户晒单评论+图片实例
    用PHP抓取百度贴吧邮箱数据
    微信公众号天气查询接口实例
    【Python】自动化升级所有pip安装的包
  • 原文地址:https://www.cnblogs.com/CUCmehp/p/1447275.html
Copyright © 2020-2023  润新知