C++ 模板特化和类型萃取

本文章参考朱友鹏老师的C++课程

模板特化

  1. 模板特化类似于函数重载,而且都是编译链接时确定,而非运行时确定的
  2. 特化。specialize 就是让模板参数T在某个具体类型时,可以特殊处理。
  3. 特化的模板声明,前面一般是template<>

要求函数对数值类型的参数比较大小,对string类型的参数,比较字符串的长度

全特化

//函数模板
template<typename T>
bool compater(T a, T b) 
{
     
    return (a > b ? true:false);
}

//对compater函数的string类型进行特化处理
template<>      //对函数模板进行特化时,需要保留泛化的关键字在函数定义前,防止编译器不认识
bool compater(string a, string b)
{
     
    return (a.size() > b.size ? true:false);
}


int main(void)
{
     
    //第一种 数值类型, 在未指定参数类型为特化string类型时,编译器调用泛化类型,即函数模板
    int a = 1, b = 2;
    cout << compater(a, b)<<endl;   //输出false,调用bool compater(T a, T b) 
    
    //第二种 string类型,当指定类型为特化类型时,编译器调用特化的函数
    string a = "linux", b = "ucos";
    cout << compater(a, b)<<endl;   //输出false ,调用bool compater(string a, string b)
 }

偏特化

模板偏特化
顾名思义“偏特化”是相对于“全特化”来说的,偏特化是指对模板内泛化的部分参数,进行特化处理,这样既保留了,模板泛化的优势,又可以对特殊情况进行处理。
注意函数模板不能偏特化,因为函数模板偏特化可以使用函数重载实现,函数重载语法出现时间比模板偏特化时间要早,故不能打破原有的语法

//类模板偏特化
#include 
#include 

using namespace std;
template
class base
{
public:
         void compater(T1 a, T2 b)
          {
                   cout<< "bool compater(T1 a, T2 b) " << endl;
          }
};

template  //这要将没有特化的参数T1声明
class base
{
public:
          void compater(T1 a, double b)
          {
                   cout<< "bool compater(T1 a, double b) " << endl;
          }
};

void main()
{
          int p1 = 2;
          double p2 = 2.5;
          base b1;   //此时T1为int   double为偏特化参数
          b1.compater(p1, p2);   //输出打印为"bool compater(T1 a, double b) " 
}

 未完待续。。。。。













你可能感兴趣的:(C++,c++)