模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。
模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。
1.类模板
template<typename T1,typename T2>
class Jack
{
private:
T1 a;
T2 b;
public:
Jack(T1 x, T2 y) :a(x), b(y)
{
cout << "无特化 a:" << a << " b:" << b << endl;
}
};
//偏特化
template<typename T>
class Jack<int,T>
{
private:
int a;
T b;
public:
Jack(int x, T y) :a(x), b(y)
{
cout << "偏特化 a:" << a << " b:" << b << endl;
}
};
//全特化
template<>
class Jack < int, double>
{
private:
int a;
double b;
public:
Jack(int x, double y) :a(x), b(y)
{
cout << "全特化 a:" << a << " b:" << b << endl;
}
};
void main()
{
Jack<int, double> j1(1, 22.2);//全特化
Jack<int, bool> j2(100, true);//偏特化
Jack<double, int> j3(0.88, 200);//无特化
system("pause");
}
结果:
2.函数模板
template<typename T1,typename T2>
void gogogo(T1 a, T2 b)
{
cout << "无特化模板函数,a:" << a << " b:" << b << endl;
}
template<>
void gogogo(int a, double b)
{
cout << "全特化模板函数,a:" << a << " b:" << b << endl;
}
template<typename T>
void gogogo(int a, T b)
{
cout << "偏特化模板函数,a:" << a << " b:" << b << endl;
}
void main()
{
gogogo<int,double>(100, 20.99);
gogogo<int,bool>(1, true);
gogogo(20.33333, 10086);
system("pause");
}
结果:
从结果可以看出函数模板不能偏特化,只能全特化。
查了相关资料知道了为啥不能偏特化:
没有函数偏特化,仅仅是因为C++标准语言说不行(you can’t partially specialize them – pretty much just because the language says you can’t),另外我觉得有了函数重载,函数偏特化也没什么用