c++模板本质上是为了将算法与数据类型脱离。换句话说,就是为了使一个算法对任何的数据类型都可用。
模板有两种,一种是函数模板,另一种是类模板。
先说函数模板
#include<iostream>
using namespace std;
template<class T> void GetMax(T a, T b) {
if (a > b)
cout << a << endl;
else
cout << b << endl;
}
int main() {
GetMax(19, 20);
}
在函数名前加上template,表示这个是模板函数;所有需要作为模板的变量,均可以用T来进行声明。在调用时,可以按照普通函数调用方式来进行调用。
再说类模板。类模板是为了使得类的功能实现不受数据类型困扰,所以类中的成员变量均可以替换为模板类型。
代码如下:
#include <iostream>
using namespace std;
template <class T> class compair {
T v1, v2;
char* a= "compair is running!";
public:
static T s;
compair(T f, T s) {
v1 = f;
v2 = s;
cout << a << endl;
}
T getmax();
};
template <class T>
T compair<T>::s = 0;
template <class T>
T compair<T>::getmax() {
if (v1 > v2)
{
s = v1;
return v1;
}
else
{
s = v2;
return v2;
}
}
int main() {
compair<char*> c("ab","cd");
cout << c.getmax()<<endl;
cout << c.s << endl;
return 0;
}
在上述代码中,模板类中有静态模板成员变量,普通模板成员变量和普通成员变量。要注意,在类模板调用时,要声明模板中的数据类型。那么现在思考的问题是,可否在模板中设置多个模板参数?答案是可以的。
示例代码如下:
#include <iostream>
using namespace std;
template <class T,class U> class compair {
T v1, v2;
U u1;
char* a= "compair is running!";
public:
static T s;
compair(T f, T s) {
v1 = f;
v2 = s;
cout << a << endl;
}
T getmax();
};
template <class T,class U>
T compair<T,U>::s = 0;
template <class T,class U>
T compair<T,U>::getmax() {
if (v1 > v2)
{
s = v1;
u1 = v2;
cout << u1 << endl;
return v1;
}
else
{
s = v2;
u1 = v1;
cout << u1 << endl;
return v2;
}
}
int main() {
compair<char*,char*> c("ab","gd");
cout << c.getmax()<<endl;
cout << c.s << endl;
return 0;
}
上述代码中,模板里面引用了两个模板变量。查询资料可知,模板创建可以有以下几种形式。
template <class T> // 最常用的:一个class 参数。
template <class T, class U> // 两个class 参数。
template <class T, int N> // 一个class 和一个整数。
template <class T = char> // 有一个默认值。
template <int Tfunc (int)> // 参数为一个函数。
从第三条可知,我们的代码不是十分规范,最规范的应该在模板参数列表里面写入所设置的普通变量类型。
参考文献