康老师

c++中常见的模板类

2021-07-19 22:50:56
相关推荐

模板类英文为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

}

因为,它是一个特化的模板类,所以只有普通模板存在的情况下,它的存在才是合法的,不然我们是对什么进行特化的呢

阅读剩余内容
网友评论
相关阅读
小编推荐