C++ 模板与泛型之函数模板
面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况。不同之处在于:OOP能处理类型在程序运行之前都未知的情况;而在泛型编程中,在编译时就能获知类型了。模板和泛型非常重要,比如在STL中vector等都是泛型编程,先说说函数模板。
定义模板
使用 template<typename T>
关键字可以定义函数模板,例如:
template <typename T>
int compare(const T&v1, const T&v2)
{
if (v1 < v2)
return -1;
else if (v1 > v2)
return 1;
else
return 0;
}
int main()
{
//double num1=1.09;
//double num2 = 2.33;
int num1 = 19;
int num2 = 2;
cout << compare(num1, num2) << endl;
system("pause");
return 0;
}
编译器将根据实参来推断需要实例化的不同模板,比如,上述实例化的两个版本分别是:
int compare(const int &v1,const int &v2){}
int compare(const double &v1,const double &v2){}
<typename T>
用来指定模板参数,该参数除了可以表示参数类型以外,还可以表示返回类型,变量声明,类型转换。
模板编译
在之前的博客中提到了C++模板不能支持分离式编译,即模板的声明和定义必须在同一个文件中。
模板定义并不生成代码,只有当实例化一个模板的特例的时候,编译器才生成代码,为了生成一个实例化的版本,编译器需要掌握函数模板或类模板成员函数的定义,因此在头文件中既要包括声明又要包括定义。