模版是泛型编程中一种重要的手段,泛型编程意思是让多种数据类型的数据都可以在一个代码段算法中使用。泛型的代表作就是STL。其中模版则是让数据类型参数化,让调用者在使用的时候,多传递一个操作数据的类型便可以调用一份“参数个数相同而类型不同,且函数体相同”的代码段,这个代码段可以让多种数据类型都可以计算出正确的结果。我们首先来看一个常规情况下函数重载的例子。
#include <iostream> using namespace std; int Max(int a, int b) { return a > b ? a : b; } double Max(double a, double b) { return a > b ? a : b; } int main(int argc, char* argv[]) { cout << Max(15, 22) << endl; cout << Max(12.4, 18.7) << endl; return 0; }
上面代码中重载了 Max 函数,让调用者可以操作两种类型的数据,一种是int,一种的double,而一旦我们再想操作一个其他类型,就必须要重写一份 Max 函数来构成重载。而如果用函数模版的方式来解决这个问题,将是非常简单的。代码如下:
#include <iostream> #include <string> using namespace std; // 声明一个模版 template<typename T> // 利用模版,把函数里面的类型全部替换掉 T Max(T a, T b) { return a > b ? a : b; } int main(int argc, char* argv[]) { cout << Max(15, 22) << endl; cout << Max(12.4, 18.7) << endl; cout << Max(11.4, 28.5) << endl; cout << Max("abcd", "efgh") << endl; return 0; }
以上便阐述了函数模版存在的价值以及简单的实现方法,下面我们看一下类模版。同样,类模版也是为了解决上面类似的问题。
#include <iostream> #include <string> using namespace std; template<typename T> class TemplateTest { public: T Max(T a, T b); }; // 每一个实现的前方都要加这段语句 template<typename T> T TemplateTest<T>::Max(T a, T b) { return a > b ? a : b; } int main(int argc, char* argv[]) { TemplateTest<int> t; cout << t.Max(10, 20) << endl; TemplateTest<double> t1; cout << t1.Max(15.2, 20.3) << endl; return 0; }