那么,什么是泛型呢?本节就带领读者深度剖析一下这个问题。
所以泛型,实质上就是不使用具体数据类型(例如 int、double、float 等),而是使用一种通用类型来进行程序设计的方法,该方法可以大规模的减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。
为了更好地说明使用具体数据类型有多么麻烦,这里先举个例子,假设客户需要一个函数,功能是返回两个 int 类型数据中较大的那个,很多读者自然而然会编写如下代码:
int maxt(int x, int y) { return (x > y) ? x : y; }
可是没过几天,该用户又提出需要编写一个返回两个 double 类型数据中较大的那个,于是我们需要之前的代码进行修改:
double maxt(double x, double y) { return (x > y) ? x : y; }
之后,该用户又提出需要再编写一个能返回两个 char 类型数据中较大的那个…。可以看到,只是因为数据类型不同,就迫使我们不得不把具有相同功能的代码写了若干遍,这样的实现方法简直令人崩溃。
为了解决类似的问题,有聪明的人将代码修改成如下的样子:
T maxt(T x, T y) { return (x > y) ? x : y; }
如此,当用户需要某个数据类型的 maxt 函数时,我们只需要把其中的 T 替换成用户需要的实际数据类型就行了。
那么,代码中的 T 是什么呢?很明显,这是一个占位符,更确切的说是一个类型占位符。也就是说,将来在 T 这个位置上的是一个真实、具体的数据类型,至于到底是哪个类型,完全取决于用户的需求。
当然,如果硬要给 T 这种类型占位符也叫做一种数据类型,提供这种想法的发明者称它为泛型(generic type),而使用这种类型占位符的编程方式就被称为泛型编程。
值得一提的是,既然泛型并不是真实的数据类型,那么使用泛型编写的代码也就不是真正的程序实体,只能算是一个程序实体的样板。故此,通常形象的将这种使用了泛型的代码称为模板,由模板生成实际代码的过程称为模板的具体实现。
注意,类型占位符的替换工作,不需要人为操控,可以完全交由计算机来完成,更准确的说,是交由编译器在编译阶段来完成模板的具体实现。
总之一句话,泛型也是一种数据类型,只不过它是一种用来代替所有类型的“通用类型”。在 C++ 中,用以支持泛型应用的就是标准模板库 STL,它提供了 C++ 泛型设计常用的类模板和函数模板。
有关 STL 模板库,由于不是本节重点,这里不再赘述,后续章节会做详细介绍。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/23715.html