目录
一、什么是模板特化
二、函数模板特化
1.函数模板特化的步骤
三、类模板特化
1.全特化
2.偏特化
1.部分特化
2.参数更进一步的限制
一、什么是模板特化
使用模板可以实现一些与类型无关的问题。但并不是能够解决所有数据类型的问题,针对需要特殊处理的数据类型,则需要对模板进行特殊化处理。例如:
对于字符串的比较,由上图可知,结果应该为1,却输出为0。原因是实参传入的是ch1和ch2的首地址,虽然ch1与ch2的字符串相等,但ch1和ch2是在栈上开辟的空间,在不同的地址上存放了两份“hello world"的拷贝。所以比较ch1和ch2的地址,肯定是不相等的。这时,我们就需要对比较字符串进行模板特化。
二、函数模板特化
1.函数模板特化的步骤
1.必须要先有一个基础的函数模板。
2.template关键字后面加一个空的尖括号<>。
3.函数名与参数列表之间加一个尖括号,尖括号中指定需要特化的数据类型。函数名<类型>(参数列表)。
4.函数形参的基础类型需和模板函数的参数的基础类型相同,否则报错。例如:
函数模板中有引用,特化也需要加引用。
const char*为特化时我们指定的类型,&为函数模板中的基础类型。
函数模板中有const,特化也需要加const。
const char*为我们指定的类型,const & 为函数模板中的基础类型。
函数模板中既没const,也没引用,则我们特化时只需自己指定类型,不需要加基础类型。
特化后的结果:
会调用与自己类型相匹配的模板。
三、类模板特化
1.全特化
将模板中的所有参数确定化。
调用的为特化后的模板。
2.偏特化
针对模板参数进一步进行条件限制的特化,有两种表现形式。
1.部分特化
确定参数列表中的部分类型。
2.参数更进一步的限制
带有引用。
带有指针
带有引用和指针