目录
非类型模板参数
模板的特化
什么是特化
函数模板特化
类模板特化
全特化
偏特化
模板分离编译
什么是分离编译
为什么模板不支持分离编译
解决方法
模板的优点和缺陷
//非类型模板参数--整形常量
template
class MyStack
{
public:void Push(const T& x){}
private:T _a[N];size_t _top;
};int main()
{MyStack st1;MyStack st2;return 0;
} 1. 非类型模板参数只能是整形。 2. 非类型模板参数必须在编译时就能确认结果。 //函数模板--参数匹配
template
bool ObjLess(T left, T right)
{return left < right;
}bool ObjLess(Date* left, Date* right)
{return *left < *right;
}template<>
bool ObjLess(Date* left, Date* right)
{return *left < *right;
}int main()
{cout << ObjLess(1, 2) << endl;Date* p1 = new Date(2011, 1, 23);Date* p2 = new Date(2013, 3, 23);//参数匹配cout << ObjLess(p1, p2) << endl;return 0;
} 步骤:
1. 必须要先有一个基础的函数模板 2. 关键字template后面接一对空的尖括号<> 3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型 4. 函数形参表: 必须要和模板函数的基础参数类型完全相同template
class Data
{
public:Data(){ cout << "Date" << endl;}
private:T1 _d1;T2 _d2;
};//特化--特殊化
template<>
class Data
{
public:Data() { cout << "Data" << endl; }
private:int _d1;char _d2;
};int main()
{//Data d1;//Data d2;qwe::priority_queue pq;pq.push(new Date(2022, 3, 26));pq.push(new Date(2021, 10, 26));pq.push(new Date(2023, 3, 26));while (!pq.empty()){cout << *pq.top();pq.pop();}cout << endl;return 0;
} template
class Data
{
public:Data(){cout << "Data" << endl;}
private:T1 _d1;T2 _d2;
};//全特化
template<>
class Data
{
public:Data(){cout << "Data" << endl;}
}; //偏特化
template
class Data
{
public:Data(){cout << "Data" << endl;}
};template
class Data
{
public:Data(){cout << "Data" << endl;}
};template
class Data
{
public:Data(){cout << "Data" << endl;}
}; 对非类型模板参数也可以
template
class A
{
public:A(){cout << "A" << endl;}
};template<>
class A<10>
{
public:A(){cout << "A<10>" << endl;}
}; 1.显示实例化
2.声明和定义不分离