在C++中,内置类型的遍历,我们只需要进行浅拷贝就可以,但自定义类型就不一定了。比如之前类与对象中,如果类中对象涉及到资源,我们使用深拷贝的方式进行拷贝构造等操作,如果不涉及资源,则使用简单的浅拷贝,在模拟实现string类\vector等中也遇到。这样虽然可以,但代码效率低。
所以,为了将内置类型与自定义类型区分开,就有了类型萃取,它是类模板特化的应用。那么我们先来了解类模板特化以及非类型模板参数
非类型模板参数
模板参数分为类型形参与非类型形参
注意:
- 浮点数,类对象以及字符串是不允许作为非类型模板参数的
- 非类型模板参数必须在编译期就能确认结果
模板的特化
有时我们使用模板实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,看下面代码
代码1
template<class T>
T MAX(T left, T right)
{
return left > right ? left : right;
}
int main()
{
char* p1 = "world";
char* p2 = "hello";
cout << MAX(p1, p2) << endl;
比较字符串大小时,这里面比较的是指针类型,因此不管p1、p2是什么字符串,打印的都是p2,所以如果不直接将函数直接给出,用模板的话,就要将模板特化了
代码2
//格式就是这样
template<>
char* MAX<char*>(char*& left, char*& right)//函数形参表必须要和模板函数的基础参数类型完全相同
{
if (strcmp(left, right)