• 模板特化


    模板

    • 模板是C++泛型编程的一种技术
    • 在减少代码冗余的同时仍然可以提供类型安全
    • 能够在编译器生成对应类型的代码,实现编译器多态,增强代码复用

    模板分为类模板和函数模板,声明方式相同,在类定义/函数定义之前声明模板参数列表

    // 类模板
    template <class T1, class T2>	// T1、T2为模板参数列表
    class A
    {
        T1 data1;
        T2 data2;
    };
    
    // 函数模板
    template <class T>
    T max(const T lhs, const T rhs)
    {
        return lhs > rhs ? lhs : rhs;
    }
    


    模板特化

    • 对于某些特定的参数类型,你可能有更好的实现。对于这些特定的类型,单独指定实现,优先进行匹配。

    • 特化分为全特化与偏特化。全特化就是限定死模板参数列表的具体类型,偏特化则只限定模板参数列表中的某一部分。


    类模板

    • 类模板既有全特化也有偏特化
    template<class T1, class T2>
    struct Test
    {
        Test() { cout << "类模板" << endl; }
    };
    
    template<>	// 此处的<>中的参数为空
    struct Test<int, double>
    {
        Test() { cout << "全特化" << endl; }
    };
    
    template<class T>
    struct Test<T*, int>
    {
        Test() { cout << "偏特化" << endl; }
    };
    
    //template<class T>	// 无效的模板参数,没有对应的普通模板!!!
    //struct Test<T*>
    //{
    //    Test() { cout << "偏特化" << endl; }
    //};
    
    //template<class T *>	// 无效的模板参数
    //struct Test
    //{
    //    Test() { cout << "指针模板" << endl; }
    //};
    
    void testClassTemplate()
    {
        Test<char, double> t1;	// 类模板
        Test<int, double> t2;	// 全特化
        Test<int *, char> t3;	// 类模板
        Test<int*, int> t4;		// 偏特化
    }
    
    • 以template<>开头的模板类就是全特化模板类

    函数模板

    • 函数模板只有全特化没有偏特化,因为偏特化的功能可以通过函数重载完成
    //模板函数
    template<typename T1, typename T2>
    void fun(T1 a , T2 b)
    {
        cout<<"模板函数"<<endl;
    }
    
    //全特化
    template<>
    void fun<int ,char >(int a, char b)
    {
        cout<<"全特化模板"<<endl;
    }
    
    //函数不存在偏特化:下面的代码是错误的
    //template<typename T2>
    //void fun<char,T2>(char a, T2 b)
    //{
    //    cout<<"偏特化"<<endl;
    //}
    
    template<typename T1>	// 函数模板不存在偏特化
    void fun(int i, T1 t)	// 此处为函数重载
    {
        cout << "模板函数fun" << endl;
    }
    
    void testFuncTemplate()
    {
        fun(3.14, 2);     // 模板函数
        fun(1, 1);	      // 模板函数fun
        fun(1, (char)1);  // 全特化模板
    }
    

    其他

    • 无论是全特化还是偏特化,都必须包含一个普通模板的定义
    • 只定义特化模板而不定义普通模板,会编译报错
    • 特化模板即于对于某些参数类型,单独指定其实现方式。在编译期匹配时,用指定的实现方式来生成代码。



    参考博客:

    https://harttle.land/2015/10/03/cpp-template.html
    https://www.cnblogs.com/diegodu/p/4627044.html

  • 相关阅读:
    XI.spring的点点滴滴--IObjectFactoryPostProcessor(工厂后处理器)
    Ⅹ.spring的点点滴滴--IObjectPostProcessor(对象后处理器)
    Ⅸ.spring的点点滴滴--IObjectFactory与IFactoryObject的杂谈
    Ⅷ.spring的点点滴滴--抽象对象和子对象
    Ⅶ.spring的点点滴滴--自定义对象行为
    Ⅵ.spring的点点滴滴--自定义类型转换器
    Ⅴ.spring的点点滴滴--引用其他对象或类型的成员
    Ⅳspring的点点滴滴--方法和事件
    Ⅲ.spring的点点滴滴--赋值
    Ⅱ.spring的点点滴滴--对象
  • 原文地址:https://www.cnblogs.com/oumae/p/16101667.html
Copyright © 2020-2023  润新知