中常见的模板类?
模板类英文为class template,template的中文翻译为模板,所以模板类的意思其实是:类的模板。
顾名思义,模板类是相当于一个模具,当参数给定时,生成具体的类,也叫实例化。它的提出主要是为了减少代码重复。
例如,我们可以用下面的代码交换两个数b和c
a = b;
b = c;
c = a;
这个交换过程与a,b,c的具体类型没有关系,因此我们可以用它来交换两个整数,或者两个浮点数。更一般的,我们可以用来交换两个具有赋值运算符的类型。因此,可以用模板进行一般化:
template<class T>
void swap(T &b, T &c){
a = b;
b = c;
c = a;
}
当然,上面介绍的这个不是模板类,而是模板函数。不过他们的概念是类似的。其中一开始的template代表后面尖括号中的是模板参数(类似于函数的参数),class代表参数是类(相应的,可以用template<int N>来声明整型参数)。后面的代码和的函数基本没有区别,只是用T来代替了具体的类型,例如int,double等。根据需要我们可以用swap<int>(b,c)来交换两个整数,swap<double>(b,c)交换两个浮点数。由于编译器可以根据b,c的具体类型推导T的具体含义,因此可以简写为swap(b,c)。
回到模板类,假设我们需要一个类型来代表动态数组,且该类型支持size成员函数。如果是整型的类,我们可能会写
class vector_int{
size_t size() const;
};
如果某一天,我们又需要浮点类型的动态数组,可能又会写
class vector_double{
size_t size() const;
};
于是就会发现它们的代码是如此的类似,因此我们希望将它一般化。如同swap函数的做法,我们将它定义为模板类:
template<class T>
class vector{
size_t size() const;
};
因此,vec_int等同于vector<int>,而vector_double等同于vector<double>。因为运用模板类的语法类似于
vector<T> a;
因此,编译器没办法为我们推导T的具体含义,所以不能像模板函数一样进行简写。
当然,上面是比较简单的情况,有时候我们需要的类在大多数情况下是一样的,但是对于某几个特殊情形可能不太一样,例如我们可能希望对于bool类型的数组能尽量减少内存的使用,用一个比特位代表一个bool值。从而,我们的数组不是通过bool a[10]的形式来定义。在这种情况下,c++提供了模板特化,也就是说当模板的参数取某个具体的值时,我们使用不同的模板,定义方式如下:
template<>
class vector<bool>{
size_t size() const;
};
因为,它是一个特化的模板类,所以只有普通模板存在的情况下,它的存在才是合法的,不然我们是对什么进行特化的呢?
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有