zoukankan      html  css  js  c++  java
  • C++ 模板学习记录1

      因为C++模板中有很多概念,总是容易忘记,所以学习了之后,特地总结一下,方便下次复习。

      

      1、类模板和模板类的区别

        类模板是一个关于类的模板

             模板类是类模板实例化后的实体。

        2、特化是针对模板参数更进一步的条件限制所设计出来的特化版本。

           模板全特化和偏特化,全特化是把所有模板形参进行限制。 偏特化是把部分形参进行限制。

      模板特化和偏特化后,还是一个类模板。

    //Grap 为形参
    template<typename Grap>
    class Calculate
    {
    public:
        int GetGirth(const Grap& grap);    //获取周长
    };
    
    template<typename Grap>
    int Calculate<Grap>::GetGirth(const Grap& grap)
    {
        int iGirth = 0;
        for (int i = 0; i < grap.GetEdgeCount(); ++i)
        {
            iGirth += grap.GetEdgeLength(i);
        }
        return iGirth;
    }
    
    
    class Circle
    {
    public:
        int iR;
    };
    
    //特化,其中 Circle为实参
    template<>
    class Calculate<Circle>
    {
    public:
        int GetGirth(const Circle& grap);    //获取周长
    };
    
    //template<>        注意:不需要写这一行
    int Calculate<Circle>::GetGirth(const Circle& grap)
    {
        return 2 * grap.iR * 3.14;
    }
    View Code

          3、模板实例化

       一个通过具体值替换模板参数,从模板产生普通类、函数或者或者成员函数的过程。

       4、类模板和函数模板的区别

         a) 类模板没有自动类型推导的使用方式。

       b)类模板在模板参数列表中可以有默认参数,既可以缺省。

         c)对函数模板,只能全特化,不能偏特化。

      5、函数模板不能自动类型转换。

      void max(T a, T b);

      调用 max('a',42.6) 编译错误。

      6、函数重载可以完成代替函数偏特化

    #pragma once
    
    template<typename T1,typename T2>
    void func(T1 t1, T2 t2)
    {
    
    }
    
    
    #if 0
    /*
    不能偏特化
    */
        template<typename T2>
        void func<int,T2>(int t1, T2 t2)
        {
    
        }
    #endif
    
    //可以通过重载实现偏特化的效果
    
    template<typename T2>
    void func(int t1, T2 t2)
    {
    
    }
    View Code

      7、类模板偏特化

    #pragma once
    
    template<typename T1,typename T2>
    class D
    {
    
    };
    
    template<typename T1>
    class D<T1,int>
    {
    
    };

    8、类模板的显式实例化,在未调用的时候就已经实例化了。

    template<typename T>
    class E
    {
    
    };
    
    //类的显示实例化
    template class E<int>;

    9、函数模板的显式实例化

    template<typename T>
    void Fun(T t)
    {
    
    }
    //函数的显式实例化
    template void Fun<int>(int);
  • 相关阅读:
    Linux Shell入门
    Linux系统结构
    Ubuntu bond 配置
    VXLAN概述
    lsof
    入驻博客园,希望可以跟大家一起讨论,一起学习和进步。
    版本管理工具小乌龟TortoiseGit的安装和使用(2)
    版本管理工具小乌龟TortoiseGit的安装和使用(1)
    定义变量时未初始化赋值的问题
    BlackBerry 9900刷机
  • 原文地址:https://www.cnblogs.com/jlyg/p/15487187.html
Copyright © 2011-2022 走看看