非类型模板参数
模板形参分为两种
类型模板参数: 及跟在class或typename后面的参数类型名称
非类型模板参数: 就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用
这里的N是常数, 是可以作为数组的初始化长度的存在.
注意:
- 浮点数, 类对象和字符串是不允许作为非类型模板参数的.
- 非类型模板参数必须在编译器就可以确定结果.
模板的特化
我们在使用模板的时候有可能需要对一些固定的类型做特殊处理不然会使代码出现问题.
比如我们实现一个less函数作为大小的比较.
此时就需要对模板进行特化.
及针对特殊的类型进行特殊的函数实现操作.模板特化分为类模板特化 函数模板特化
其中函数模板特化 其实大部分都是可以通过实例化实现的方式来解决.
所以模板的特化我们一般用于类上面.
全特化
如有以下代码:
template<class T1,class T2>
class test
{
public:
test()
{
cout << "test()T1 T2" << endl;
}
};
template<>
class test<char,int>
{
public:
test()
{
cout << "test()char int" << endl;
}
};
int main()
{
test<int, int>();
test<char, int>();
return 0;
}
执行结果如上图:
这里我们的test类就通过特化实现了当类需要对如char int 类型进行的特殊化处理.
这种特化我们称为全特化.及将所有的模板参数进行了特化.
偏特化
如有以下代码:
template<class T1,class T2>
class test
{
public:
test()
{
cout << "test()T1 T2" << endl;
}
};
偏特化可以分为两种特化
- 部分特化
template<class T1>
class test<T1 ,char>
{
public:
test()
{
cout << "test()T1 char" << endl;
}
};
如上代码就是将当T2类型为char的时候转入的.
- 类型限制特化
我们也可以指定一种类型进行特化如指针
,引用
.
代码如下:
template<class T1, class T2>
class test<T1*,T2*>//指针的特化
{
public:
test()
{
cout << "test()<T1*,T2*>" << endl;
}
};
template<class T1, class T2>//引用类型的特化
class test<T1&, T2&>
{
public:
test()
{
cout << "test<T1&, T2&>" << endl;
}
};
template<class T1, class T2>//引用加指针
class test<T1&, T2*>
{
public:
test()
{
cout << "test<T1&, T2*>" << endl;
}
};