• c++模板特化偏特化


    模板为什么要特化,因为编译器认为,对于特定的类型,如果你对某一功能有更好地实现,那么就该听你的。

    模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是模板如果有多个类型,那么就只限定为其中的

    一部分,其实特化细分为范围上的偏特化与个数上的偏特化。

    模板的泛化:是指用的时候指定类型。

     

    上面的方框内的内容是指模板的泛化,下面的方框内的内容是指模板的特化。特化的优先级比泛化的优先级高。

    模板的偏(范围)特化是指个数,范围上的偏特化

    个数上的偏特化,从左到右

    测试代码如下:

    #include <iostream>
    using namespace std;
    template<typename T1,typename T2>
    class Test{
    public:
        Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"<<endl;}
    private:
        T1 a;
        T2 b;
    };
    template<>   //全特化,由于是全特化,参数都指定了,参数列表故为空。
    class Test<int ,char>{
    public:
        Test(int i,char j):a(i),b(j){cout<<"全特化"<<endl;}
    private:
        int a;
        int b;
    };
    template<typename T2> //由于只指定了一部分参数,剩下的未指定的需在参数列表中,否则报错。
    class Test<char,T2>{
    public:
        Test(char i,T2 j):a(j),b(j){cout<<"个数偏特化"<<endl;}
    private:
        char a;
        T2 b;
    };
    template<typename T1,typename T2> //这是范围上的偏特化
    class Test<T1*,T2*>{
    public:
        Test(T1* i,T2* j):a(i),b(j){cout<<"指针偏特化"<<endl;}
    private:
        T1* a;
        T2* b;
    };
    template<typename T1,typename T2>//同理这也是范围上的偏特化
    class Test<T1 const,T2 const>{
    public:
        Test(T1 i,T2 j):a(i),b(j){cout<<"const偏特化"<<endl;}
    private:
        T1 a;
        T2 b;
    };
    
    
    
    
    int main()
    {
        int a;
        Test<double,double> t1(0.1,0.2);
        Test<int,char> t2(1,'A');
        Test<char,bool> t3('A',true);
        Test<int*,int*> t4(&a,&a);
        Test<const int,const int> t5(1,2);
        return 0;
    }

     运行结果截图:

    而对于函数模板,却只有全特化,不能偏特化:

    #include <iostream>
    using namespace std;
    //模板函数
    template<typename T1,typename T2>
    void fun(T1 a,T2 b){
        cout<<"模板函数"<<endl;
    }
    //全特化
    template<>
    void fun(int a,char b){
        cout<<"全特化"<<endl;
    }
    //函数不存在偏特化,以下代码是错误的
    /*
    template<typename T2>
    void fun(char a,T2 b){
        cout<<"偏特化"<<ednl;
    }
    */
    int main()
    {
        int a=0;
        char b='A';
        fun(a,a);
        fun(a,b);
        return 0;
    }
    运行截图如下:

    
    
    
  • 相关阅读:
    一起学爬虫(Python) — 02
    模块(第1章)实验——编译问题(没有规则可以创建目标“modules”)
    linux 启动时,sendmail 长时间等待
    红帽发布首个RHEL 7测试版本
    AMD:引入ARM将是自64位以来的最大变革
    (OK) Windows XP 硬盘安装 RHEL7/CentOS7/Fedora19/Fedora20
    Windows 7 硬盘安装 RHEL7/CentOS7/Fedora19/Fedora20
    linux-0.11内核调试运行阅读环境的搭建及使用
    rhel 7—— /boot/grub2/grub.cfg
    Linux环境下网络编程杂谈
  • 原文地址:https://www.cnblogs.com/invisible2/p/8001192.html
Copyright © 2020-2023  润新知