C++ primer 二十一 模板

来源:互联网 发布:c语言标准函数库百度云 编辑:程序博客网 时间:2024/05/16 01:41

       模板定义以关键字template开始,后跟一个模板参数列表(template parameter list),这是一个逗号分隔的一个或多个模板参数(template parameter)的列表,用小于号(<)和大(>)包围起来。

       模板参数列表的作用很像函数参数列表。函数参数列表定义了若干特定类型的局部变量,但并末指出如何初始化它们。在运行时,调用者提供实参来初始化形参。
       类似的,模板参数表示在类或函数定义中用到的类型或值。当使用模板时,我们(隐式地或显式地)指定模板实参(template argument),将其绑定到模板参数上。
       我们定义一个compare函数,声明一个名为T的类型参数。在compare中,我们用名字T 表示一个类型。而T表示的实际类型则在编译时根据compare的使用情况来确定。

template<typename T> int compare(const T&v1,const T&v2)

{

if(v1<v2)return -1;

if(v2<v1)return 1;

return 0;

}

实例化函数模板

       当我们调用一个函数模板时,编译器(通常)用函数实参来为我们推断模板实参。即, 当我们调用compare时,编译器使用实参的类型来确定绑定到模板参数T的类型。例如, 在下面的调用中:

cout << compare(1, 0) <<endl; // T 为 int

实参类型是int。编译器会推断出模板实参为int,并将它绑定到模扳参数T。

        编译器用推断出的模板参数来为我们实例化(instantiate) 一个特定版本的函数。当编译器实例化一个模板时,它使用实际的模板实参代替对应的模板参数来创建出模板的一个新“实例”。例如,给定下面的调用:

//实例化出int compare(const int&, const int&)

cout << compare(1, 0) << endl; // T 为 int

// 实例化出 int compare (const vector<int>&, const vector<int>& )

vector<int> vecl{1, 2, 3}f vec2{4, 5, 6};

cout << compare (vecl, vec2) << endl; // T 为 vector<int>

        编译器会实例化出两个不同版本的compare。对第一个调用,编译器会编写并编译一 个compare版木,其中T被替换为int:

int compare(const int &vl, const int &v2)

{

if (vl < v2) return -1; 

if (v2 < vl) return 1; 

return 0;

}

       对第二个调用,编译器会生成另一个compare版本,其中T被料换为vector<int>。 这些编译器生成的版本通常被称为模板的实例(instantiation)。

源文件:

#include<iostream>
#include<cstring>
using namespace std;
template<unsigned N,unsigned M> int compare(const char(&p1)[N],const char(&p2)[M]);

template<typename T,unsigned N> void print(T(&arr)[N])
{
for(auto elem:arr)
{
cout<<elem<<" ";
}
cout<<endl;
}
int main()
{


cout<<compare("ohiffg","mom")<<endl;
int a[4]={1,2,3,4};
print(a);
return 0;
}
template<unsigned N,unsigned M> int compare(const char(&p1)[N],const char(&p2)[M])
{
return strcmp(p1,p2);
}
运行结果:






0 0
原创粉丝点击