1.非类型模板参数
模板参数类型参数与非类型形参
类型参数:出现在模板参数列表中,跟class或者typename之类的模板类型名称
非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类模板中可以将该参数当作常量使用
cpp
// 1. 类型参数(最常用)
template<typename T> // T 是类型参数
class Vector { T* data; };
// 2. 非类型参数(编译期常量)
template<int N=10> // N 是非类型参数
class Array { int data[N]; };
2.函数模板的特化
函数形参表,必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报不同的错误
ps:如果遇到函数模板不能处理的或者有误的类型,可以直接给出函数参数
cpp
template<class T1, class T2>
class B
{
public:
B(T1 b1,T2 b2)
:_b1(b1)
,_b2(b2)
{}
private:
T1 _b1;
T2 _b2;
};
//全特化
template<>
class B<char,char>
{
public:
B(char b1, char b2)
:_b1(b1)
, _b2(b2)
{}
private:
char _b1;
char _b2;
};
//半特化
template<class T2>
class B<char,T2>
{
public:
B(char b1, T2 b2)
:_b1(b1)
, _b2(b2)
{}
private:
char _b1;
T2 _b2;
};
//类的特化
template<class T1,class T2>
class B<T1*,T2*>//限制是指针
{
public:
B(T1* b1, T2* b2)
:_b1(b1)
, _b2(b2)
{}
private:
T1* _b1;
T2* _b2;
};
//类的特化
template<class T1, class T2>
class B<T1&, T2&>//限制是引用
{
public:
B(T1& b1, T2& b2)
:_b1(b1)
, _b2(b2)
{}
private:
T1& _b1;
T2& _b2;
};
int main()
{
B<int, int>b1(1, 2);
int a = 3;
int b = 4;
int* p1 = &a;
int* p2 = &b;
B<int*, int*>b2(p1,p2);
B<int&, int&>b3(a,b);
B<char, int>b4('+', b);
B<char, char>b5('+', 'p');
return 0;
}