c++ 定义模板

定义模板

当定义一个比较函数时,因为参数类型包括int、float、char等等,若为每个类型都定义一个比较函数,就不得不重复定义完全一样的函数体,并且需要确定要比较的所有类型,就比较麻烦了。

函数模板 : 以关键字开始 加一个模板参数列表

template <typename T>

这样就可以定义一个通用的函数模板,而不是为每一数据类型都定义一个新函数

template <typename T>
int compare(const T &v1,const T &v2)
{
    if(v1 < v2) return -1;
    if(v1 > v2) return 1;
    return 0;
}

T的实际类型在编译时根据compare的使用情况确定

实例化函数模板

// 例如:
cout << compare(1,0) << endl; // T为int,编译器会推断出实参为int,并将它绑定到模板参数T

// 实例化出int compare(const int& , const int&)
cout << compare(1,0) << endl;
// 实例化出int compare(const vector& , const vector&)
vector<int> vec1{1,2,3},vec2{4,5,6};
cout << compare(vec1,vec2) << endl;

模板参数类型

可以将类型参数看作类型说明符,类型参数可以制定返回类型函数的参数类型,以及在函数体内用于变量声明类型转换

类型参数前必须使用关键字class 或 typename

模板的头文件既包括声明也包括定义:

当编译器遇到一个模板定义时,它并不生成代码。只有当实例化出模板的一个特定版本时,编译器才会生成代码。

为了生成模板的实例化版本,编译器需要掌握函数模板或类模板成员函数的定义,因此,模板的头文件通常既包括声明也包括定义。

通常,当调用一个函数时,编译器只需要掌握函数的声明,类似的,当我们使用一个类类型的对象时,类定义必须是可用的,但成员函数的定义不必已经出现。因此,将类定义和函数声明放在头文件中,而普通函数的定义和类的成员函数的定义放在源文件中。

你可能感兴趣的:(C++基础,C++,模板)