1. 非类型模版参数
模板参数分类类型形参与非类型形参。
类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常
量来使用。
注意:
1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2. 非类型的模板参数必须在编译期就能确认结果。
2. 模版的特化
2.1 函数模版的特化
函数模板的特化步骤:
- 必须要先有一个基础的函数模板
- 关键字template后面接一对空的尖括号<>
- 函数名后跟一对尖括号,尖括号中指定需要特化的类型
- 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇
怪的错误。
这里我们对第四点举一个例子
这就属于没有完全相同基础模版的cosnt修饰的是a,b,而我们下面修饰的是*a,*b;
改成如下就好了
因此我们不建议写成函数模版我们可以实现一个函数来完成特化的操作
2. 2 类模版的特化
2.2.1 全特化
全特化即是将模板参数列表中所有的参数都确定化。
例子如下
template<class T1, class T2>
class Data
{
public:
Data() { cout << "Data<T1, T2>" << endl; }
private:
T1 _d1;
T2 _d2;
};
template<>
class Data<int,double>
{
public:
Data() { cout << "Data<T1, T2>" << endl; }
private:
int _d1;
double _d2;
};
2.2.2 偏特化
1. 部分特化
template<class T1, class T2>
class Data
{
public:
Data() { cout << "Data<T1, T2>" << endl; }
private:
T1 _d1;
T2 _d2;
};
class Data<T1, double>
{
public:
Data() { cout << "Data<T1, double>" << endl; }
private:
T1 _d1;
double _d2;
};
2. 参数更进一步的限制
偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一
个特化版本。
template<class T1, class T2>
class Data
{
public:
Data() { cout << "Data<T1, T2>" << endl; }
private:
T1 _d1;
T2 _d2;
};
template<class T1,class T2>
class Data<T1*,T2*>
{
public:
Data() { cout << "Data<T1*, T2*>" << endl; }
private:
T1 *_d1;
T2* _d2;
};
3. 模版分离编译
我们建议模版的声明和定义在一起
如果我们把add这个模版定义和声明全部放在a.h中,首先.h文件展开在main.cpp说明模版的声明定义都有了接着把它实例化了;因此会有实例化函数的地址,这样在连接时就可以找到该函数了