持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
泛型编程是一种编程思想,首次接触到泛型,还是参数的类型的一种放宽,有时候可以通过一种行为对类型进行约束,也可以理解为根据特定需求将具有满足特定行为或者属性的类型聚集在一起,来定义一个更加宽泛的类型,这是自己对泛型一点理解
泛型编程(Generic programming)
是一个编程思想,这种方法将类型(type)以一种 to-be-specified-later 方式给出,等到需要调用的时候,基于调用函数参数的类型,通过具体的、特定,实例化(instantiate) 一个具体的方法或对象,template 使用生成函数或者类的模板,在调用函数或者对象时,也就是在编译时基于模板生成对应函数体和对象
- 泛型编程作为一种编程的想法或思维,不依赖于具体的语言
- 大多数面向对象的语言(OO languages)都支持泛型编程
- C++ 里面的泛型时通过模板以及相关性质表现的
模板
模板是 C++ 中泛型编程的基础。c++ 作为一种强类型的语言,在声明变量时,需要为其指定一个类型,这个工作可以由程序员明确声明,也可以由编译器推断。其实对于算法来说,可能就是接受具有一定行为的数据,只要某些数据具有特定行为,就可以这些具有相同行为的数据类型看成一个类型,然后当调用时用户需要指定具体的类型。
模板和泛型编程
模板是在 c++ 语言中,模板是泛型编程的一种支持,如果将泛型编程了解为抽象概念,那么模板是泛型编程的具体实现。
模板和函数重载
函数重载是方便了函数的调用者,不过这样做并没有减少开发人员的工作量。而模板对开发人员确实 friendly 模板是切切实实可减少 developer 的工作量。
模版的定义和使用
模板是一种结构,在编译时根据用户提供的模板参数生成一个普通的类型或函数。例如,可以这样定义一个函数模板。
template <typename T>
T minimum(const T& a, const T& b) {
return a < b ? a : b;
}
上面的代码中,描述了一个具有单一类型参数 T 的通用函数的模板,其返回值和调用参数 (a 和 b) 都是这个类型。可以随心所欲地为类型参数起个名称,但通常都是用单个大写的字母来表示类型变量。T 是一个模板参数,tyename 关键字表示这个参数是一个类型的标识符。当函数被调用时,编译器根据用户指定的或编译器推断的类型参数替换 T 。编译器从模板中生成一个类或函数的过程被称为模板实例化。minimum<int> 是模板minimum<T>的实例化。
int res = minimum<int>(a, b);
可以像上面那样,在调用 minimum<int> 这样显式地在调用 minimum 函数执行类型参数为 int,也可以像下面让编译器自己去推断传入变量的类型。
int i = minimum(a, b);
编译器会根据用户指定的类型或者编译器推断类型将 T 替换为 int 来根据模版生成一个函数。
int min(const int& a, const int& b) {
return a > b ? b : a;
}
类型参数
在上面的最小模板中,注意类型参数 T 没有任何限定,直到被用在函数调用参数中,在那里添加了const和reference限定词。
template <typename T, typename U, typename V> class Foo{};
template <class T, class U, class V> class Foo{};
在定义类别变量时,可以指定为 typename 或者 class 都可以,并没有明确的区别。
### 参考文献
[Templates (C++) | Microsoft Docs](https://docs.microsoft.com/en-us/cpp/cpp/templates-cpp?view=msvc-170)