模板特化
将模板中的参数指定为特定的类型,模板特化之后可以针对特效类型实现特定的功能。
模板全特化
所有参数都特化为确定的类型。
模板类和模板函数都可以全特化。
全特化的模板参数列表是空的。
示例1,函数全特化:
template<typename T> T add(T t1,T t2)
{
return t1 + t2;
}
这个模板函数int类型可以正常使用,但char不行,这时候可以特化一个char类型的:
template<typename T> T add(T t1,T t2)
{
return t1 + t2;
}
template<> char add(char c1,char c2) //注意,这里模板参数列表为空
{
return (c1 + c2 - 192)%26 + 96;
}
int main(int argc, char *argv[])
{
qDebug()<< add<char>('a','b');
}
示例2,类全特化:
template <> class info <QString,QString>
{
public:
info(QString name, QString age)
{
qDebug()<<"构建 template <> class info <QString,QString>";
}
};
模板偏特化
模板参数列表有多个参数时,将部分参数特化。
只能用于模板类,模板函数不能偏特化。
例:
template <typename T1,typename T2> class info
{
public:
info(T1 name, T2 age)
{
qDebug()<<"构建 template <typename T1,typename T2> class info";
}
};
template <typename T1> class info<T1,int>
{
public:
info(T1 name, int age)
{
qDebug()<<"构建 template <typename T1> class info<T1,int>";
}
};
int main(int argc, char *argv[])
{
info<QString,int>("张三",88);
}
模板的重载
重载函数是普通函数,并非模板函数。
如果重载函数和模板的某种类型的类型参数相同,依次按以下规则匹配:
- 参数完全匹配的普通函数。
- 模板参数完全匹配的函数模板。
- 隐式转换后匹配的普通函数。