如果对于两种不同类型的数值进行比较,可能会写出以下的代码:
int compare(const string &v1, const string &v2) { if (v1 < v2) { return -1; } if (v2 < v1) { return 1; } return 0; }
int compare(const double &v1, const double &v2) { if (v1 < v2) { return -1; } if (v1 > v2) { return 1; } return 0; }
这两个函数除对数值比较类弄不一样外,函数体是一样的,而且重写麻烦。
这时候就需要模版了
template <typename T> int compare(const T &v1, const T &v2) { if (v1 < v2) { return -1; } if (v1 > v2) { return 1; } return 0; }
用一个函数体即可完成,这个就是所谓的通用函数模板。
1、定义
模版定义以关键字template开始,后跟模板参数列表(template), 这个列表是一个逗号分隔的一个或多个模版参数的列表,用小于号<和大于号>包起来。
2、实例化
模版定义好后,调用会实例化
cout << compare(1, 2) << endl; // compare(const int &v1, const int &v2)
由于编译器遇到一个模版定义时,它并不生成代码。只有实例化出模版时一个特定的版本时,编译器才会生成代码。这一特性影响我们如何组织代码及错误何时被检测到。