模板
STL是泛型编程的思想,C++的模板就是泛型编程的基础,模板即类型参数化
模板与宏函数
学过c的都知道有个宏函数的概念,宏函数是发生在预编译阶段,可以实现通过修改少量代码来改变很多处结构的思想,这其实就是泛型的思想。
//关于宏函数的简单介绍
#include <stdio.h>
#define AGE_OLDER (65) //这里将AGE_OLDER定义为65,AGE_OLDER是判断是否为老人的界限。
//65外面的括号是为了防止在替换时产生错误,每个宏函数都应尽量加上括号
int main(int argc,char ** argv) //进程的思想是一生二,二生三,三生万物。一般来讲main函数是
//程序的入口,但main函数也是不凭空来的,argc和argv和他的爹有关,
//这里不细说
{
int zhangsan=80; //这里定义张三的年龄为80
if(zhangsan > AGE_OLDER) //年龄大于AGE_OLDER(65)视为老人
{
printf("这是个老人");
}
int lisi=50;
if(lisi > AGE_OLDER)
{
printf("这不是老人");
}
}
从以上代码可以看出,通过修改AGE_OLDER,可以直接修改main函数中两个地方的值,起到了方便修改的作用。但是宏函数容易产生二义性。
模板就是采用了宏函数的思想,不过发生在编译器阶段。同时,模板可用于类的泛型化。
下面写分别用宏函数以及模板写string,int和double类型的替换
宏函数版本:
#include <iostream> //宏函数版本
using namespace std;
#define MAX(T) T MAX_##T(T x,T y) {return x> y? x:y;} //这里的##起连接的作用
MAX(int) MAX(double) MAX(string) //产生了两次替换,一次是类型,一次是参数
#define max(T) MAX_##T //使得MAX_int可以写成max(int)
int main()
{
cout<<"max 4,5 = " << max(int)(4,5)<<endl;
cout<<"max 4.5,5.5 = "<<max(double)(4.5,5.5)<<endl;
cout<<"max china,nzhsoft = "<<max(string)("china","nzhsoft")<<endl;
return 0;
}
结果如下:
max 4,5 = 5
max 4.5,5.5 = 5.5
max china,nzhsoft = nzhsoft
模板版本
#include <iostream>
using namespace std;
template <typename T> //这里typename也可以写成class
T Max(T x, T y)
{
return x >y? x:y;
}
int main()
{
cout<<"max 4,5 = " << Max<int>(4,5)<<endl; //由于c++自带max函数,所以需写成Max
cout<<"max 4.5,5.5 = "<<Max<double>(4.5,5.5)<<endl; //也可以用::max解决命名冲突的问题
cout<<"max china,nzhsoft = "<<Max<string>("china","nzhsoft")<<endl;
return 0;
}
结果如下:
max 4,5 = 5
max 4.5,5.5 = 5.5
max china,nzhsoft = nzhsof
模板的一些注意事项
1.模板并不会生成处理任何类型的实体,而是对于实例化模板参数的类型都从模板产生一个不同的实体,这种具体类型代替模板参数的过程称为模板实例化。实例化后的函数构成了重载关系,这种重载关系由C++类处理。
2.当使用函数模板并引发实例化的过程中,编译器需要查看模板的定义(而普通函数只需要声明即可)。鉴于此,通常将模板的声明与实现写同一个文件中,以(.h)结尾。
3.有些函数不需要输入,c++的模板会帮你推断类型。不过这种不输入类型的方法不保险,所以,尽量不采用这种方法。
4.在类模板中,但凡是表示类型的场合,都应该采用类模板名<模板参数>,但是多数编译器允许简化为类模板名。 见代码
template <typename T>
class compare
{
public:
compare(T x, T y):_x(x),_y(y)
{}
conpare(const compare<T> &another) //这里使用const compare &another也是可以的
{
_x=another._x;
_y=another._y;
}
int max()
{
return _x>_y ? _x:_y;
}
private:
T _x;
T _y;
}
总结
差别 | 一般函数 | 模板 |
---|---|---|
传入的参数 | 变量如50,‘a’等 | 数据的类型,如int char |