模板
模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
模板是一种对类型进行参数化的工具;
模板包括函数模板(function template)和类模板(class template)。
函数模板
针对仅参数类型不同的函数
template <class 形参名,class 形参名,......>
返回类型 函数名(参数列表)
{
函数体
}
如下代码所示sort是一个模板函数
#include<algorithm>
void main()
{
int a[] = { 1,2,3,2,3,42,4,5,7 };
char a[] = { 'a','b','w' };
int n = sizeof(a) / sizeof(a[0]);
sort(a, a + n);//模板
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
举例:将Max模板化
int Max(int a, int b)
{
return a > b ? a : b;
}
double Max(double a, double b)
{
return a > b ? a : b;
}
char Max(char a, char b)
{
return a > b ? a : b;
}
void main()
{
cout << Max(4, 6) << endl;
cout << Max(4.1, 1.6) << endl;
cout << Max('a','A') << endl;
}
其函数模板如下所示:
template<class T> //函数模板——经过类型参数化——>模板函数
T Max(T a, T b)
{
return a > b ? a : b;
}
void main()
{
cout << Max(4, 6) << endl;//类型参数化
cout << Max(4.1, 1.6) << endl;
cout << Max('a', 'A') << endl;
}
函数模板具体化:
/模板的特化——具体化
template<>
const char* Max(const char* a, const char* b)
{
cout << "const char* max" << endl;
return strcmp(a, b) > 0 ? a : b;
}
void main()
{
cout << Max("333","555") << endl;//const char*
}
类模板
针对仅数据成员和成员函数类型不同的类
类模板定义如下:
template<类型模板参数表>
class 类名
{
…… //类声明体
}; //再次指出分号不可少
template<类型模板参数表>
返回类型 类名<模板参数表>::成员函数名1(形参表)
{
……;//成员函数定义体
}
……
template<类型模板参数表>
返回类型 类名<模板参数表>::成员函数名n(形参表)
{
……;//成员函数n定义体
}
//类型替换的过程被称为模板实例化 template instantiation
例如:
template<class T>
class A
{
public:
A(T i):m_i(i){}
void print()
{
cout << "m_i=" << m_i << endl;
}
private:
T m_i;
};
void main()
{
A<int> a(4); //将int当成参数传递给模板中的T->模板类
a.print();
A<char>b('6');
b.print();
}
类模板具体化:
template<>
class A<const char*>
{
public:
A(const char*i)
{
m_i = new char[strlen(i) + 1];
strcpy_s(m_i, strlen(i) + 1, i);
}
~A()
{
delete[]m_i;
}
private:
char* m_i;
};
void main()
{
A<const char*>d("helloworld");
d.print();
}