/* * 函数模板 * 当调用某个函数时,就要以某种方式传递类型给这个函数。那么就能够使用一个函数定义替换前面额全部这些函数定义了。
* 模板就能够做到这一点: * 模板机制是重要的强大的。而且如我们说提到的,在C++的标准模板库(STL)中从头到尾都在是使用它。 * 模板使得类和函数不仅能通过形參接收要被存储和处理的数据值。还能够通过形參接收数据的类型。因此这 * 提供了一种编写通用和易于重用的代码的方法。由于模板定义能够用来创建一个类或函数的多个实例, * 每一个实例都能够存储和处理一种不同类型的数据。
* */ //我们针对数值交换问题写一个函数模板 #include <iostream> #include <string> using namespace std; template <typename DataType> /* * 告诉编译器两件事: * 1.这个是一个函数模板,一个由此能够创建函数的模式 * 2.标识符DataType取代了某个类型形參的名字。当函数被调用时。将被给定一个值 * * 使用形參DataType取代某个特定的类型,定义的剩余部分则简单的规定了程序的行为。在哈苏模板内部和外部 * 它都没有做不论什么事情,当编译器碰到一个模板,比如swap()。它不过简单地存储这个模板而不产生不论什么实际的机器指令 * 他在依据须要的基础上使用模板给出的模式来产生实际的函数定义。 */ void swap(DataType& first,DataType& second) { DataType temp = first; first = second; second = temp; } /* * 函数模板 * 形式: * template <typename TypeParam> * function * 或 * template <class TypeParam> * function * * 更通用的形式: * template <specifier TypePaream1,...,specifier TypeParamn> * function * 在这些形式中。TypeParam,TypeParam1...是表示函数在其上的操作的值的类型的通用类型形參,每一个specifier * 是关键词typename或者class;而function是这个函数的原型或者定义。 * 注意: * 1.单词template是一个C++的关键词,规定其后说跟的是一个函数模式,而不是一个实际的函数原型或者定义 * 2.关键词typename和class能够哎一个类型形參列表中交换使用 * 3.和正规的函数不同,一个函数模板不能被切割为一个包括他们的原型的头文件和一个包括唐门顶一个的编译文件。在不论什么的 * #include函数模板的程序中,他们的定义必须和他们的编译,这样,一种通用的方式将他们放在一个文件里,还有一种方法是 * 将定义放在单独的文件里,可是在函数原型所在的文件的最后#include定义文件。
* 4.一个函数模板不过描写叙述依据给定的实际类型产生不同的函数的一个模式,这个创建函数的过程被称为实例化。在每一个实例化中。 * 类型形參被称为绑定到一个传递给他的实际类型。 * 5.在通用形式中,假设编译器只依靠调用中的实參的类型来决定绑定什么呢类型到类型形參。那么每一个类型形參必须在函数的形 * 參列表中至少出现一次。 */ /* * 一个函数模板的实例化是通过使用以下的算法进行的: * 1.在函数模板的形參列表中的搜索类型形參 * 2.为每一个雷系ing形參推断对应实參的类型 * 3.将这两种类型绑定在一起 */ template <typename ElementType> void display(ElementType array[],int numElement) { for(int i=0;i<numElement;i++) cout << array[i] << " "; cout << endl; } int main() { string first = "C++"; string second = "C"; swap(first,second); double x[] = {1.1,2.1,3.2,4.5,6.5,7.6}; display(x,sizeof(x)/sizeof(double)); int num[] = {1,2,3,4,5,6}; display(num,sizeof(num)/sizeof(int)); }