C++学习笔记——理解模板

模板是泛型编程的基础。所谓泛型,就是不管什么数据类型,一切通吃。但泛型这个词翻译得不太好,仅从字面意思是不太容易理解成一切通吃的意思。

接下来还是转到模板正题。
比如,我们要获得两个数中的最大数,一种情形是数据都是int, 另一种情形是数据都是double. 这样的话就需要写两个函数,以适应不同的数据类型:

int getMax(int x, int y){
	return x>y?x:y;
}

double getMax(double x, double y){
	return x>y?x:y;
}

除了数据类型不一样,两个函数体没有任何区别,代码完全相同。所以,有没有可能简化一下写法呢?不得不承认,世界的进步都是由懒人推动的。为了解决这个问题,模板就诞生了。我们用模板先重写一下上面的函数:

template <typename T>
T getMax(T x, T y){
	return x>y?x:y;
}

看看是不是跟上面的函数长得也很像?函数体完全一样,只有数据类型都改成了T, int 和 double 在这里达成了统一T。先不要着急这段代码是什么意思,我们先看看它该怎么用。

//传统调用
int max=getMax(10,8);
double max=getMax(10.56,8.31);

//用模板来实现
int max=getMax<int>(10,8);
double max=getMax<double>(10.56,8.31);

是不是很干爽?
调用的时候,只需要在<>中指明本函数适用的类型即可。

让我们再回到模板定义的代码段:

template <typename T>

这句话是告诉编译器,请注意,我要定义一个模板了!这个模板共涉及到一个数据类型,它的名字就叫T。如果你的模板涉及到多个数据类型(通常包括参数类型和返回值类型),那就在<>里都写上,比如<typename T1, typename T2>

紧接着就是模板的实现,我要定义一个获得最大数的函数,两个参数类型和返回值类型都一样,所以用一个数据类型T就够了:

T getMax(T x, T y){
	return x>y?x:y;
}

这该例中,由于参数数据类型包括了该模板的所有数据类型,因此,调用模板时,程序会根据参数类型倒推模板涉及到的类型,所以调用时可以更简单一些,比如

int max=getMax(10,8);
//可以把getMax后面的<int>去掉

C++毕竟是OOP的, 所以, 除了函数模板, 应用更广泛的其实是类模板.当然,函数其实也是一种对象.

我们先来个类模板的例子。在这个例子中,先定义一个 名为A的class, 这个类有两个成员函数,一个是返回值类型为int,一个参数类型不定,另一个参数为int的函数。另外一个成员函数是返回值类型和参数类型都不确定且第二个参数和返回值同一类型的函数。

template <class T1,class T2> class A {
	private:
	    int a;
	    T1 b;
	public:
	    int f1(T1 x, int y);
	    T2 f2(T1, T2);
};

template <class T1,class T2> 
int A<T1,T2>::f1(T1 x, int y) {
    return x + y;
}

template <class T1, class T2> 
T2 A<T1,T2>::f2(T1 x, T2 y) {
    return x - y;
}

调用起来也是相当简单:

A<int, float> A1;//初始化一个T1=int且T2=float的对象A1
int z=A1.f1(3, 4);
float f=A1.f2(5, 6.9);

通过这个例子能看出,其实类模板和函数模板没有什么重大差异,只不过一个按类的格式定义,一个按函数格式定义。

不过,还是有一点点差异。我们在定义函数模板时,声明数据类型用的关键词是typename T, 而在类里用的是class T。typename 和 class有差别吗?截止到目前,我还没有发现。这两个关键词可以任意替换都不会有问题。如果以后发现了,再回这里更新吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值