/* * 函数模板 * 当调用某个函数时,就要以某种方式传递类型给这个函数,那么就可以使用一个函数定义替换前面额所有这些函数定义了。 * 模板就可以做到这一点: * 模板机制是重要的强大的,并且如我们说提到的,在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)); }
原文地址:http://blog.csdn.net/berguiliu/article/details/28416579