目录
1. 什么是泛型
泛型,实质上就是不使用具体数据类型(例如 int、double、float 等),而是使用一种通用类型来进行程序设计的方法,该方法可以大规模的减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。
Generic programming is defined in Musser & Stepanov (1989) as follows,
泛型在 Musser & Stepanov (1989)中定义如下:
Generic programming centers around the idea of abstracting from concrete, efficient algorithms to obtain generic algorithms that can be combined with different data representations to produce a wide variety of useful software.
泛型的核心思想是从具体的、高效的算法中抽象出来,获得通用算法,这些算法可以与不同的数据表示结合,生成各种各样的有用软件。
— Musser, David R.; Stepanov, Alexander A., Generic Programming
What are generics in programming?
Generics are kind of like functions for variable types. Normally, you make a function for a task that you do a lot of, so instead of having to repeat the same code over and over again, you let the compiler and computer do that behind the scenes for you.
泛型类似于变量类型的函数。通常情况下,你为一个你做了很多的任务创建一个函数,所以不必一遍又一遍地重复同样的代码,你可以让编译器和计算机在幕后为你做这些。
泛型编程(Generic Programming)是一种语言机制,通过它可以实现一个标准的容器库。
像类一样,泛型也是一种抽象数据类型,但是泛型不属于面向对象,它是面向对象的补充和发展。在面向对象编程中,当算法与数据类型有关时,面向对象在对算法的抽象描述方面存在一些缺陷。泛型在C++中的主要实现为模板函数和模板类。
2. 为什么需要泛型
泛型在C++中的主要实现为模板函数和模板类。
通常使用普通的函数实现一个与数据类型有关的算法是很繁琐的,比如两个数的加法,要
考虑很多类型:int add(int a,int b) { return a+b; } float add(float a,float b) { return a+b; }
在C++中可以通过函数重载来解决这个问题,但是反复写相同算法的函数是比较辛苦的,更重要的是函数重载是静态编译,运行时占用过多内存。
在此我们可以用C++的模板函数来表达通用型的函数,如下:template<typename T> // 模板声明 T add(T a,T b) { return a+b; } // 注意形参和返回值的类型
3.泛型如何用
#include <iostream>
using namespace std;
int add(int a,int b) { return a+b; }
float add(float a,float b) { return a+b; }
template <typename T>
T add(T a,T b) //注意形参和返回类型
{
return a+b;
}
void main()
{
int num1, num2, sum;
cin>>num1>>num2;
sum=add(num1,num2); //用int匹配模版参数T,若sum,num1,num2类型不一致则无法匹配。
cout<<sum;
}
那么,代码中的 T 是什么呢?很明显,这是一个占位符,更确切的说是一个类型占位符。也就是说,将来在 T 这个位置上的是一个真实、具体的数据类型,至于到底是哪个类型,完全取决于用户的需求。
当然,如果硬要给 T 这种类型占位符也叫做一种数据类型,提供这种想法的发明者称它为泛型(generic type),而使用这种类型占位符的编程方式就被称为泛型编程。
总之一句话,泛型也是一种数据类型,只不过它是一种用来代替所有类型的“通用类型”。在 C++ 中,用以支持泛型应用的就是标准模板库 STL,它提供了 C++ 泛型设计常用的类模板和函数模板。