C++ Primer 第16章 模板与泛型编程 学习笔记

news/2024/7/5 19:26:29

1.      定义模板

a) 假定我们希望编写一个函数比较两个值,并指出第一个值是大于、小于或是等于第二个值,我们可能会定义多个重载函数:

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(v2<v1)	return 1;
	return 0;	
}

这两个函数唯一的差异是参数类型。对每种希望比较的类型都不得不重复定义完全一样的函数体既繁琐又容易出错还不能用在用户提供的类型上

b)        我们可以定义一个通用的函数模板,而不是为每个类型都定义一个新函数。

c)        一个函数模板就是一个公式,可用来生成针对特定类型的函数坂本

d)        compare的模板坂本可能像下面这样:

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



2.      函数模板:

a)        模板定义以关键字template开始,后跟一个不能为空的模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用<>包围起来

b)        模板参数列表的作用很像函数参数列表。函数参数列表定义了若干特定类型的局部变量,但并未指出如何初始化它们。在运行时,调用者提供实参来初始化形参

c)        类似的,模板参数表示在类或函数定义中用到的类型或值。当使用模板时,我们(隐式地或显式地)指定模板实参,将其绑定到模板参数

d)        compare函数声明了一个名为T类型参数。在compare中,用名字T表示一个类型,而T表示的实际类型则在编译时根据compare的使用情况确定




3.      实例化函数模板

a)        当我们调用一个函数模板时,编译器用函数实参来为我们推断模板实参(调用compare时,编译器使用实参的类型确定绑到模板参数T的类型)。例如,下面的调用中, 实参类型是int,编译器会推断出模板实参为int,并将它绑定到模板参数T

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

b)        编译器用推断出的模板参数来为我们实例化一个特定版本的函数。当编译器实例化一个模板时,它使用实际的模板实参代替对应的模板参数来创建出模板的一个新实例

//实例化出int compare(const int&,const int&)
cout<<compare(1,0)<<endl;    //T为int
//实例化出int compare(const vector<int>&,const vector<int>&)
cout<<compare(vec1,vec2)<<endl;    //T为vector<int>
这些编译器生成的坂本通常被称为模板的示例



4.      类模板

a)        类模板是用来生成类的蓝图的

b)        与函数模板的不同之处是,编译器不能为类模板推断模板参数类型。为了使用类模板,我们必须在模板名后的尖括号中提供额外信息(以vector为例,提供的额外信息是 vector内所存放对象的类型,如vector<int> ivec)用来代替模板参数的模板实参列表





转载于:https://www.cnblogs.com/chuninggao/p/7275428.html


http://www.niftyadmin.cn/n/2711499.html

相关文章

javaee中数据库异常_李孟_新浪博客

java.sql.SQLException: ORA-00928: 缺失 SELECT 关键字at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.…

SRM707 div1 MultiplyAddPuzzle

题目大意&#xff1a;给定4个数&#xff0c;s,t,a,b 每次可以将s加a或者乘b&#xff0c;问最少多少次可以得到t 做法&#xff1a;考虑最后的形式&#xff0c;肯定是s*b^n a*f(b)&#xff0c;f(b)是关于b的多项式 那么b乘多少次实际上是可以知道的&#xff0c;然后枚举b的次数n…

C#重写 重载 new

重载就是多态的一种体现 多态的原理表述:一个父类可以有多个子类&#xff0c;父类是子类中方法的“交集”&#xff0c;子类中可以根据自己实际需要来加入新的方法&#xff0c;或则完善父类中的方法&#xff0c;当把子类的对象赋值给父类类型的对象时&#xff0c;这时候在调用同…

javaee中数据库异常

java.sql.SQLException: ORA-00928: 缺失 SELECT 关键字 at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping. at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError. at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseEr…

为什么要在引入的css或者js文件后面加参数的详细讲解

为什么80%的码农都做不了架构师&#xff1f;>>> css和js带参数&#xff08;形如.css?v与.js?v&#xff09; 复制代码 代码如下: <script type”text/javascript” src”jb51.js?version1.2.6″></script> <link relstylesheet hrefbase.css?ver…

MaintainableCSS 《可维护性 CSS》 --- 约定篇

约定 可维护的CSS具有以下约定&#xff1a; .<module>[-<component>][-<state>] {} 根据所讨论的模块&#xff0c;方括号是可选的。这里有些例子&#xff1a; /* 模块 Module container */ .searchResults {}/* 组件 Component */ .searchResults-heading {}…

C#委托和事件的小结

参考的文章&#xff1a; http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 上面这篇文章讲得很好 委托 在调用一个方法的时候&#xff0c;为了使得方法执行的情况根据我们赋值的不同而不同&#xff0c;简单的办法是在这个方法中使用判断…

基于注解的ssm crud的项目_李孟_新浪博客

基于注解的ssm crud的项目01&#xff1a;http://blog.csdn.net/qq_19968255/article/details/52725752基于注解的ssm crud的项目02&#xff1a;http://blog.csdn.net/qq_19968255/article/details/52725761基于注解的ssm crud的项目03&#xff1a;http://blog.csdn.net/qq_1996…