创建一个类型安全函数来返回两个参数中较小的一个,如果不使用Templates,必须要编写一系列如下的函数: // min for ints int min( int a, int b ) return ( a < b ) ? a : b; // min for longs long min( long a, long b ) return ( a < b ) ? a : b; // min for chars char min( char a, char b ) return ( a < b ) ? a : b; //etc... 使用templates,可以减少重复部分,形成一个函数: template <class type> type min( type a, type b ) return ( a < b ) ? a : b; 模板能够减少源代码量并提高代码的机动性而不会降低类型安全。 何时使用模板 模板经常被用来实现如下功能: >> 创建一个类型安全的集合类(例如,堆栈)用来处理各种类型的数据 >> 为函数添加额外的类型检查以避免获得空指针 >> 合并操作符重载组来修改类型行为(例如智能指针smart pointer) 大多数以上应用可以不用模板实现;但是,模板具有以下几个优势: >> 开发容易。你可以只为你的类或函数创建一个普通的版本代替手工创建特殊情况处理。 >> 理解容易。模板为抽象类型信息提供了一个直截了当的方法。 >> 类型安全。模板使用的类型在编译时是明确的,编译器可以在发生错误之前进行类型检查。
函数模板(function templates) 使用函数模板,你可以指定一组基于相同代码但是处理不同类型或类的函数,例如: template <class type> void MySwap( type& a, type& b ) { type c( a ); a = b; b = c; } 这段代码定义了一个函数家族来交换函数的参数值。从这个template你可以产生一系列函数,不仅可以交换整型、长整型,而且可以交换用户定义类型,如果类的构造函数和赋值操作符被适当地定义,MySwap函数甚至可以交换类。 另外,函数模板可以阻止你交换不同类型的对象,因为编译器在编译时知道参数a和b的类型。 你可以像调用一个普通函数一样调用一个函数模板函数;不需要特殊的语法。例如: int i, j; char k; MySwap( i, j ); //OK MySwap( i, k ); //Error, different types. 可以对函数模板的template参数作外部说明,例如: template<class T> void f(T) {...} void g(char j) { f<int>(j); //generate the specialization f(int) } 当template参数在外部说明时,普通固定的类型转换会转换函数的参数为相应的函数模板参数。在上面的的例子中,编译器会将(char j)转换成整型