美文网首页
27 章: 模板 和 类层次

27 章: 模板 和 类层次

作者: my_passion | 来源:发表于2022-06-27 09:32 被阅读0次

Note

模板 vs. 类层次 
  |         |
  |/        |/
  GP        OO
            
(1) 
    ————————————————————————————————————————————————————————————————
    模板类 作 接口 |  特例化版本 可             通过 此接口 访问 增加新功能                      
    ————————————————————————————————————————————————————————————————
    基类   作 接口 | 派生类实现 可 (使用 vf) 通过 此接口 访问 增加新功能                 
    ————————————————————————————————————————————————————————————————
    
(2) 都允许 `1个算法` 只有 `唯一表达`, 但用于 `多种类型` -> `多态` 

(3) 组合 `超出两者` 独自所能提供的 `灵活性`
    
    vector<Shape*>
        ——————————————————————————————————————————
        1] 是 `编译时多态 (泛型)` 容器 
        ——————————————————————————————————————————
        2] 保存 `运行时多态 (OO) 类层次` 中对象的指针 
        ——————————————————————————————————————————
                                
    1) 基类指针 作 模板实参 提供   `运行时多态`              
                                            
        // 3.2.4 节 
        class Circle: public Shape { /* ... */ };

        class Smiley: public Circle
        {
        private:
            vector<Shape*> eyes;
        };      
                            
    2) 模板参数 作 基类(接口) 提供 `类型安全性`     

        // 26.2.7 来自基类的名字
        template <typename T>
        class X: public T {/* ... */};
                
(4) 2者选哪个 ?

    1)  运行时效率 & 必须用 `inline`: 只能用 模板; 类层次 靠 ptr/ref, 无法 inline  
            
    2)  想用 RTTI: 只能用 类层次; 编译时 无法获知 RTTI 
    
    3)  有 层次关系: 优选 类层次      

27.1 参数化 和 层次

1 生成类型

(1) Base* p + 数组 -> 坏设计: p[1] 指向的 is not a Shape

    void f(Shape* p, int n)
    {
        for(int i = 0; i != n; ++i)
            p[i].draw();
    }
    
    void user()
    {
        Circle image[10];
        // ...
        f(image, 10);
    }
    
    优选 容器 vector
    

2 模板类型转换

指针模板 表达 所指对象 间继承关系: 成员模板 用 类型转换运算符

27.2 类模板 层次

模板参数 在类层次中 仅几个函数使用 -> 代码膨胀 -> 优化: 成员模板 -> 优化: 成员指针 指向 模板参数 T 对象(通用接口)

    template <typename Color_scheme, typename Canvas>
    class Shape;
        
    class Shape 
    {
        template <typename Color_scheme, typename Canvas>
            void configure(const Color_scheme&, const Canvas&);
    };

1 模板(类) 作 类型安全接口: 类型转换 交给 compiler

    Vector<T*> private 继承 Vector<void*>       
                                                
    template<typename T>                        
    class Vector<T*>: private Vector<void*>     
    {                                           
    public:                                 
        using Base = Vector<void*>;             
        
        // 类型转换 交给 compiler
        T*& operator[](int i) 
        { 
            return reinterpret_cast<T*&>(Base:operator[](i) ); 
        }
    };

27.3 模板参数 T 作基类: 可接收 UserData 和 Operation

(1) 解决 OO 局限性 
    [1] 不允许改变 接口基类 中 的类型 
    [2] 与 inline 函数 相比, vf 调用代价高 

1 平衡二叉树 code & UserData 不能硬编码

version1: 
    Node 

        模板参数: UserData 
            
        Node<UserData> 作 模板实参 传给 Node_base
        
    UserData 提供 小于 < 运算符 
    
version2: 
    Node 

        模板参数: UserData & Balance(平衡算法) 
        
            Node<UserData, Balance>, Balance 作 模板实参 传给 Node_base
        
    Balance 
        
        作 Node_base 基类 (而不是成员) 好处: `空基最优化`
        
    Node_base
        模板参数: Node & Balance

version3: 
 
    Balance  
        作 Node_base 显式模板参数 冗长 

        -> 作 `隐式 模板参数`: Node 的 关联类型 + ADL 
        
        template<typename N>
        struct Node_base: N::balance_type {/* ... */};
        
优势: 相比于 用 void*

    [1] 类型安全: code 不必 对 void* 类型转换 

    [2] 高性能: 用 void* 则 无法使用 `基于类型 的 优化技术`
模板类型转换: 指针模板 + 成员模板(类型转换运算符).jpg 模板类型转换: 指针模板 + 成员模板(类型转换运算符) -> 2层 template.jpg 平衡树: 版本1.jpg 平衡树: 版本1.jpg 平衡树: 版本2.jpg 平衡树: 版本3.jpg 平衡树: 版本4.jpg 建议.jpg

相关文章

  • 27 章: 模板 和 类层次

    Note 27.1 参数化 和 层次 1 生成类型 (1) Base* p + 数组 -> 坏设计: p[1] 指...

  • 类模板和模板类

    我是一个不喜欢看定义的人,我个人觉得知道怎么用就行了,这是一种糟糕的表现,可能是快节奏的的社会,让我做出的选择。从...

  • Java可重入锁原理

    一、 概述 本文首先介绍Lock接口、ReentrantLock的类层次结构以及锁功能模板类AbstractQue...

  • C++模板类模板成员函数的定义与使用

    1 模板类和模板函数 对于大多数人来说都知道如何定义模板类和模板函数,很少会触及模板类的成员函数还有自己的模板参数...

  • 模板函数和模板类

    函数模板和类模板

  • 读书笔记:《学会写作》-模板写作、新媒体写作

    继续《学会写作》的阅读。 “模板写作”第一节作者给出了四类实用的模板:通知类模板、分析类模板、计划类模板和总结类模...

  • 模板与泛型 —— using 定义模板别名

    一、类的成员函数模板 二、using 定义模板别名 一、类的成员函数模板 普通类和模板类,其成员函数都可以是模板函...

  • 说说 Spring 的事务管理模型

    Spring 在高层次建立了统一的事务抽象以及一致的编程模板 。 Spring 提供了事务模板类 Transact...

  • 数据挖掘

    数据立方体,最小内存计算 层次聚类 首先介绍聚类中的层次聚类算法。层次法又分为凝聚的层次聚类和分裂的层次聚类。 凝...

  • C++ STL vector

    vector是一个类模板,模板本身不是类或函数(类模板和函数模板),相反可以将模板看作编译器生成类或函数的一份说明...

网友评论

      本文标题:27 章: 模板 和 类层次

      本文链接:https://www.haomeiwen.com/subject/xebgvrtx.html