一、模板特化介绍
template<class T1,class T2>
class Test
{
private:
T1 m_a;
T2 m_b;
public:
Test()
{
cout << "T1 T2" << endl;
}
};
上面是一段普通模板类的代码
1.1全特化
template<>//全特化template中缺写
class Test<char,int>
{
private:
char m_a;
int m_b;
public:
Test()
{
cout << "char int" << endl;
}
};
1.2.偏特化
template<class T1>//偏特化template缺掉要实例的那个类型
class Test<T1, int>
{
private:
T1 m_a;
int m_b;
public:
Test()
{
cout << "T1 int" << endl;
}
};
通过上面全特化和偏特化的代码可以看出:模板的全特化就是将模板的全部类型实例化,偏特化就是将模板的部分类型实例化。
int main1()
{
Test<double,float> t1;
Test<char, int> t2;
Test<double, int> t3;
system("pause");
return 0;
}
注意:
1、特化必须针对一个已经存在的函数模板,不能单独存在。
2、函数模板特化方式参考类模板特化
二、函数模板特化和函数重载的比较
template<class T1,class T2>
void Fun(T1 a,T2 b)//模板函数
{
cout << "模板函数" <<endl;
}
template<>//模板函数的全特化
void Fun(char a, int b)
{
cout << "全特化" << endl;
}
template<class T1>//模板函数的偏特化
void Fun(T1 a, float b)
{
cout << "偏特化" << endl;
}
void Fun(char a, float b)//模板函数的函数重载1
{
cout << "函数重载1" << endl;
}
void Fun(char a, int b)//模板函数的函数重载2
{
cout << "函数重载2" << endl;
}
int main()
{
char char_tmp = 0;
int int_tmp = 0;
float float_tmp = 0;
Fun(float_tmp, int_tmp);
Fun(char_tmp, int_tmp);
Fun(int_tmp, float_tmp);
Fun(char_tmp, float_tmp);
Fun(char_tmp, int_tmp);
system("pause");
return 0;
}
总结:
1.传入类型匹配度越高调用优先级越高
2.若传入类型对函数重载和模板函数的全特化一样高则优先调用函数重载
3.模板函数(类)不存在,模板函数(类)特化就不存在,函数重载就不会。