zoukankan      html  css  js  c++  java
  • 理解 traits

    1、为什么使用traits?

      考虑下面的需求,实现一个方法Advance(iter,n),接收一个迭代器iter和移动距离n,将iter向前移动n个距离。

      分析,因为存在不同类型的迭代器,做同一件事情,大家的能力不一样,做法当然不一样。有的迭代器可以一下子移到目标,有的迭代器只能一步一步移动,进行n次。因此,在方法内,必须要判断迭代器的类型,然后进行相应的操作。这种方法当然不好,运行期判断类型,需要核对继承层次中的每个类,效率差。有没有更好的办法呢?

    2、解决办法:

      a、每个迭代器暴露一个接口,暴露自己类型的别名(使用typedef MyType Category),每个迭代器都使用相同的别名。再使用一个traits类模版,对迭代器封装,对外暴露迭代器类型的别名,也就是内部迭代器的类型别名(使用 typedef iter::Category Category)。

      b、建立多个重载方法,根据迭代器类型的真名,进行重载。

      c、在Advance方法内,对iter封装,根据类型别名,调用重载的方法。

    3、分析编译器编译过程,看到Advance方法,对迭代器封装后,暴露的Category就是iter 的Category,也就是迭代器的类型别名,在编译时期,就可以知道迭代器的类型真名,因此,在编译期就可以确定下来调用哪个重载方法。

    4、其实这种场景,如果是自己的代码,更应该使用运行时多态(重写)实现上面的需求。

  • 相关阅读:
    IDEA快捷键
    Win10如何禁止软件运行?win10禁止软件启动的设置方法!禁止人生日历热点快讯的方法
    java反射
    JDBC基础
    mysql基础
    java基础
    Quartz.NET(任务调度)与Topshelf(服务)的综合使用
    【专栏学习】APM——异步编程模型(.NET不推荐)
    中小型研发团队架构实践
    Android 下拉菜单 Spinner 赋值
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3473738.html
Copyright © 2011-2022 走看看