
所谓来自的泛化编程,响酒下块相孩就是对抽象的算法的编程
- 中文名 泛化编程
- 外文名 Generalization programming
所谓的泛化编程,就是对抽象的算法的编程,泛来自化是指可以广泛的适用于不同的数360百科据类型。
模板是泛化编程(Generic Programming)的基础。
模板是C++在90年代引进的一个新概念,原怕各也本是为了对容器类(container classes)的支持,但是现在模板产生的效果已经远非当席市初所能想象。
简单的讲,模板就是一种参数化(parameterized)的类或函数,也就是类的形态(成员、方法、布局等)或者函数的形似态(参数、返回值等)山夫路航可以被参数改变。更加神奇的是这里所说的参数,不光是我们传统函数中所说的数值形式的参数,还可以是一种类型(实际上稍微有一些了解的人,更多的会注意到使用类型作为参数,而往往忽略使用数值作为参数的情况)。
举否解个常用的例子来解释也许模板就从你脑袋里的一个模糊的概念变成活生生的代码了:
在C语言中,如果我们要比较两个数的大小,常常会定义两个宏:
#de容探场升河fine min(a,b) ((a)>(b)?(b):(a))
#define max(a,觉若素b) ((a)>(b)?(a):(b))
这样你就可以在代码中:
return min(10, 4);
或者:
return min(5.3, 18.6);
这两个宏非常好用,但是在操航务耐C++中,它们并不像在C中那样受欢迎。宏因为没有类型检查以及天生的不安全(例如如果代码写为min(a++, b--);则显然结果非你所愿),在C++中被inline函数替代。但是随着你将min/max改为函地器各乡杂效兰曾数,你立刻就会发现这行乐始举面粉宗婷北讨个函数的局限性 -- 它不能处理你指定的类型以外热宁答践管操传的其它类型。例如你的min()声明为:
int min(int a, int b);
则它显然不能处绿族远理float类型的参数,但是原来的宏却可以很好的工作!你随后大结改权身马威概会想到函数重载,通过重载不同类型的min()函数,你仍然可以使大部分代码诗祖黄怕肥型江教社正常工作。实际上,C++对于这类可以抽象的算伯阳法,提供了更好的办法,就是模板试:
template <class T> const T & min(const 山所得T & t1, const T & t2) {
return t1>t2?t2:t1;
}
这六区卫即胶住护程是一个模板函数的例子。在有了模板之后,你就又自由了,可以像原来在C语言中使用你的min宏一样来使用这个模板,例如:
return min(10,4);
也可以:
return min(5.3, 18.6)
你发现了么?你获得了一个类型安全的、而又可以支持任意类型的min函数,它是否比min宏好呢?
当然上面这个例子只涉及了模板的一个方面,模板的作用远不只是用来替代宏。
评论留言