目录
非类型模板参数
通常情况下,我们可以通过类型模板参数来使用容器存放不同类型的数据,但有时我们会用到非类型模板参数。
- 类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
- 非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用
// 定义一个模板类型的静态数组
template <typename T, size_t N = 16>
class stack
{
// ...
private:
T m_a[N];
size_t m_size;
};
注意:
1. 浮点数、类对象以及字符串不允许作为非类型模板参数,非类类型模板的形参只能是整型、指针和引用。
2.非类型模板形参如果是表达式,则必须是一个常量表达式,在编译时计算出结果。
3.非类类型模板形参和实参间允许类型转换
模板的特化
概念
通常情况下,使用模板可以实现一些不同类型的代码,但对于一些特殊类型可能会得到错误的结果,如下例:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
class Date
{
public:
Date(int year = 1970, int month = 1, int day = 1)
: m_year(year)
, m_month(month)
, m_day(day)
{}
~Date() {}
bool operator<(const Date& right) const
{
if (m_year < right.m_year)
return true;
else if (m_year == right.m_year)
{
if (m_month < right.m_month)
return true;
else if (m_month == right.m_month)
{
if (m_day < right.m_day)
return true;
}
}
return false;
}
private:
int m_year;
int m_month;
int m_day;
};
template<typename T>
bool Less(T left, T right)
{
return left < right;
}
int main()
{
// 结果正确
cout << Less(15, 25) << endl;
// 结果正确
cout <&l