模板
目录:
非类型模板参数
概念:
模板参数分为类型模板参数与非类型模板参数。
类型模板参数:出现在模板参数列表中,跟在class或者typename后面的参数类型名称。
非类型模板参数:就是一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
让我们来结合代码比较一下非类型模板参数的韵味.
我们先来看一下模板类型参数。
模板类型参数定义的Array类,Array类用来管理静态的,定长的数组。
#define N 10
template<class T>
class Array
{
public:
T& operator[] (size_t pos)
{
return _a[pos];
}
private:
T _a[N];
size_t _size;
};
int main()
{
Array<int> a1;
Array<int> a2;
}
这是模板类型参数定义的Array类, 给对象开的空间只能由N来决定数组a1,a2的大小,如果a1要开10个空间,而a2也要开10个空间;那么N 为10就好了。如果a1要开10个空间,而a2要开100000个空间,把n的值给成100000的话,那么对a1来说,空间浪费也就太大了。
所以我们可以加上非类型模板参数。让我们再来体会一下。
template<class T,size_t N = 100> //定义的是常量,常量不可修改。在这里我们给了缺省值
class Array
{
public:
T& operator[] (size_t pos)
{
return _a[pos];
}
private:
T _a[N];
size_t _size;
};
int main()
{
Array<int,10> a1; //调用非类型模板参数
Array<int,100000> a2;
}
用了非类型模板参数,我们就可以方便开足够的空间,而且不会造成空间浪费。
我们对非类型模板参数的了解可以更进一步就是:非类型模板参数就是我想要外部的传参控制内部的大小。
但是值得注意的是:
- 非类型模板参数必须是常量(例子中的N)。大多数都是整形常量
- 非类型的模板参数必须在编译器就能确认结果
- 浮点数、类对象以及字符串是不允许作为非类型模板参数的。(和第一点相同)
模板的特化
起因:
通常情况下,使用模板可以实现一些与类型无关的代码,但有时候得不到成功的结果
所以。就要进行模板的特化。
概念:
在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化分为 函数模板特化与