关闭

泛型编程 模板1

标签: 模板-泛型编程
174人阅读 评论(0) 收藏 举报
分类:

一 泛型编程
首先来看一段实现加法函数的代码

int Add(const int &_iLeft, const int &_iRight)
{
     return (_iLeft + _iRight);
}

这个函数现在只能接收int类型的数据,如果我们想让他成为通用的加法函数该怎么办呢?
根据我们在C++前一段时间所学的知识,有三种方法来解决这个问题,但是这些方法也有 各自不同的问题

  • 函数重载

缺点:
1)代码复用率太低,只要有新类型出现就要再写一个像对应的函数,而这些函数的 函数体都相同
2)如果函数只是返回值不同时 函数重载也不能解决
3)有多米诺效应,一个方法出错其它的也都会出错,不便于维护

  • 使用公共基类,将通用的方法放在公共基类中

缺点:
1)借助公共基类来编写代码,将失去类型检查的优点
2)以后实现的许多类,都必须继承自这个特定的类,代码维护较为困难

  • 使用特殊的预处理程序

缺点:他不是函数,不能进行参数检测,安全性较低,也不便于代码调试
因此基于以上这些方法的缺点C++wei我们引出泛型编程的概念

泛型编程:编写类型无关的逻辑代码,时代码复用的一种手段。而模版时泛型编程的基础模版又可分为函数模版和类模版

二 模板函数&模板形参&函数重载
(一)函数模版: 代表了一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的
特定类型版本

1 函数模版的格式:
template

template <typename T>

T Add(Tl,Tr)
{
return r + l;
}

int main()
{
cout << Add(1, 2) << endl;
cout << Add(1.2, 2.3) << endl;
cout << Add(1, 2.4) <<  Lendl;/这是错误的/
cout << Add<int>(1, 2.4) << endl;


cout << Add(1, (int)1.2)<<endl;
}

其实函数调用如下图所示

第三种传参是错误的,函数无法由实参来推演模版形参类型
最后两种均发生了类型转换,调用机制和第二种相同
这里写图片描述
这里写图片描述
注意: 模板被编译了两次:
- 实例化之前,检查模板代码本身,查看是否出现语法错误,如:遗漏分号
- 在实例化期间,检查模板代码,查看是否所有的调用都有效,如:实例化类型不支持某些函数调用

3 实参推演: 从函数实参确定模板形参类型和值的过程称为模板实参推断多个类型形参的实参必须完全匹配

4 类型形参转换

一般不会转换实参以匹配已有的实例化,相反会产生新的实例。
编译器只会执行两种转换:
1)const转换:接收const引用或者const指针的函数可以分别用非const对象的引用或者指针来调用
2)数组或函数到指针的转换:如果模板形参不是引用类型,则对数组或函数类型的实参应用常规指 针转换。数组实参将当做指向其第一个元素的指针,函数实参当做指向函数类型的指针。

(二)模板参数
1 模版参数分为类型参数和非类型形参数
2 使用模版参数是要注意:

  • 模板形参名字只能在模板形参之后到模板声明或定义的末尾之间使用,遵循名字屏蔽规则
  • 模板形参的名字在同一模板形参列表中只能使用一次

  • 所有模板形参前面必须加上class或者typename关键字修饰

  • 在函数模板的内部不能指定缺省的模板实参

3 非类型模版参数: 非模板类型形参是模板内部定义的常量,在需要常量表达式的时候,可以使用非模板类型参数。
例如在求数组长度时候的
template

int Max(const int& left, const int & right)
{
 return left>right? left:right;
}
template<typename T>
T Max(const T& left, const T& right)
{
         return left>right? left:right;
}
template<typename T>
T Max(const T& a, const T& b, const T& c)
{
    return Max(Max(a, b), c);
};
int main()
{
    Max(10, 20, 30);
    Max<>(10, 20);
    Max(10, 20);
    //Max(10, 20.12);
    Max<int>(10.0, 20.0);
    Max(10.0, 20.0);
    return 0;
}

注意:函数的所有重载版本的声明都应该位于该函数被调用位置之前。
【说明】
1、一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例
化为这个非模板函数。
例如上述 Max(10, 20, 30)的调用机制如下图 即 T Max变为 int Max
这里写图片描述
2、对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调动非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数,
那么将选择模板。
例如上述Max(10, 20)的调用机制,他并没有用模版实例化出函数
这里写图片描述
3、显式指定一个空的模板实参列表,该语法告诉编译器只有模板才能来匹配这个调用,
而且所有的模板参数都应该根据实参演绎出来。
例如Max<>(10, 20)他并不能调用已给出的int max,而是用模板实例化出了一个新的函数
这里写图片描述
4、模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。
因此并不能这样调用Max(10.0,20)

未完待续ing。。。。

2
0
查看评论

[C++]模板与泛型编程

模板与泛型编程 本文尝试着介绍对泛型编程的理解,从而扩展我们的template编程。泛型编程是C++中非常重要的一部分,它使得我们节省了很多编写不同代码的体力。 1. 了解隐式接口和编译器多态与OOP的不同之处面向对象编程世界总是以显式接口和运行期多态解决问题。例如:void doProcess...
  • stary_yan
  • stary_yan
  • 2016-05-04 11:56
  • 1146

模板与泛型编程2

1.模板实参推断1.1 自动类型转换const转换:非const对象的引用(指针)传递给一个const的引用(指针)形参。 数组或函数指针转换:若函数实参不是引用类型,则可以对数组或函数类型的实参应用正常的指针转换。1.2 函数模板显示实参template <typename T1,type...
  • zhanghuanzj
  • zhanghuanzj
  • 2016-03-04 22:31
  • 258

C++模版和泛型编程

面对对象编程(OOB):能处理类型在程序运行之前都未知的情况 泛型编程:在编译时能获知类型 它们在编写时都不知道类型 泛型编程:容器,迭代器1、定义模版//书写函数比较两个变量的大小,在不知道变量类型的时候,需要定义多个重载函数,它们的函数体完全一致,唯一的差距是参数的类型 int compa...
  • u014594609
  • u014594609
  • 2016-08-03 20:21
  • 114

模板、泛型、STL之间的关系

泛型是概念, 模板是泛型的实现 泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。 泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。 所谓泛型(Genericity),是指具有在多种数据类型上皆可操作的含意,与模板有些相似。 STL以迭代器(I...
  • weiliangdemo
  • weiliangdemo
  • 2016-01-11 10:58
  • 1074

C++ Primer 学习笔记_78_模板与泛型编程 -实例化[续]

模板与泛型编程 --实例化[续] 二、函数模板的显式实参 在某些情况下,不可能推断模板实参的类型。当函数的返回类型必须与形参表中所用的所有类型都不同时,最常出现这一问题。在这种情况下,有必要覆盖模板实参推断机制,并显式指定为模板形参所用的类型或值。 1、指定显式模板实参 如...
  • u011744843
  • u011744843
  • 2016-05-09 18:55
  • 384

c++primer要点-模板与泛型编程

1.当调用一个函数模板时,编译器用函数实参来推断模板实参,并实例化一个特定版本的函数;也可以提供显示模板实参。 2.除了定义类型参数,还可以在模板中定义非类型参数,我们通过一个特定的类型名来指定非类型参数;实例化时,非类型参数被用户提供的或编译器推断的值代替,这些值必须是常量表达式。 3.默认情况下...
  • lovecrystalvc
  • lovecrystalvc
  • 2015-07-11 14:04
  • 270

C++中泛型和模板的区别

泛型是指不针对特定类型的操作处理,模板可以实例化不同的类型,包括内置类型和类类型,它们都可以实现多种类型的处理,到底有什么区别呢? 泛型的具体类型的确定是在程序运行时,而模板的实例化是在编译时确定的;泛型无特化(自定义实现特定类型的处理),模板特化可以针对特定类型处理;泛型无部分特化,模板有;模...
  • vv_20071869
  • vv_20071869
  • 2013-09-05 15:43
  • 283

C++泛型编程思想方法总结

C++用模板来实现泛型编程,模板分为函数模板和类模板。 基本概念:泛型编程范式GP:模板也叫参数类型多态化。 在编译时期确定,相比面向对象的虚函数多态,能够有更高的效率。 泛型编程是从一个抽象层面描述一种类型的算法,不管容器类型是什么,是一种不同于OOP的角度来抽象具体算法。 C++0X目前对GP的...
  • Blues1021
  • Blues1021
  • 2015-08-15 15:39
  • 4832

《C++ Primer》读书笔记——第十六章_模板与泛型编程

16.1.1 函数模板 template int compare(const T &v1, const T &v2) { if(v1 < v2) return -1; if(v2 < v1) return 1; return 0; } ...
  • u011389977
  • u011389977
  • 2016-10-12 23:16
  • 163

C++模板与泛型编程(二)——类模板

类模板的格式,实例化;类模板实现STL中Vector
  • if9600
  • if9600
  • 2017-04-12 21:55
  • 172
    个人资料
    • 访问:8759次
    • 积分:252
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类