---恢复内容开始---

一、泛型编程

定义:编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础

模板分为:函数模板和类模板

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

函数模板的格式:template<typename p1,typename p2,...,typename p>   //typename和class都可以定义模板参数一般建议使用typelate好理解和类关键字区分

返回值类型  函数名(参数列表)

{...}

模板是蓝图,本身不是类或者函数,编译器用模板产生特定的类或者函数的特定类型版本,产生模板特定类型的过程成为模板的实类化

 定义模板关键字:T是模板参数名字可以任意命名,下面代码返回值是T类型这个很重要
1 template<typename T>
T Add(T left,T right)
{
return left+right;
} int main()
{
cout<<Add(,)<<endl;;
return ;
}
//给main()函数里加一句cout<<Add(1.2,2.3)<<endl;函数模板将被编译两次
// 1.实类化之前,检查模板代码本身,查看是否出现语法错误,如:遗漏分号。2.在实类化期间,检查模板代码,查看是否所有的调用都有效,如:实类化理性不支持某些函数调用
这个返回值是T1,配合下面代码就是int ,函数返回值类型很重要,所以这里还是认真点
1 template<typename T1,typename T2>
T1 Add(T1 left,T2 right)
{
return left+right;
} int main()
{
cout<<Add(,'')<<endl;;
return ;
}

模板函数也可以定义为inline函数

 template<typename T1,typename T2>
inline T2 Add(T1 left,T2 right)
{
return left+right;
} int main()
{
cout<<Add(,'')<<endl;;
return ;
}
//返回值是字符3

模板参数:

模板函数有两种类型形参:模板参数和调用参数

模板形参分为:类型形参和非类型形参

//模板形参名字只能在模板形参之后到模板声明或定义的末尾之间使用,遵循名字屏蔽规则
1 typedef int T;
template<typename T>
void FunTest(T t)
{
cout<<"t type = "<<typeid(t).name()<<endl;
}
T gloab;
int main()
{
FunTest();
cout<<"gloab type = "<<typeid(gloab).name()<<endl;
return ;
}

eg:判断下面函数定义是否有问题

 //template<class T,U,typename V>
//void F1(T,U,V);
//模板参数不能这样定义,模板参数前必须加上定义模板参数关键字class或者typeame
//template<class T>
//T F2(int &T); //template<class T>
//T F3(T,T);
//typedef int TYPENAME;
//template<typename TYPENAME>
//TYPENAME F4(TYPENAME);

模板函数重载:

 主要看看下列情况调用哪个函数
1 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(,,);//3
Max<>(,);//2
Max(,); //1
Max(,20.0);//1
Max<int>(10.0,20.0);//2
Max(10.0,20.0);//2
return ;
}
//注意:函数的所有重载版本的是声明都应该位于该函数被调用位置之前

二、模板函数特化

在某些情况下,通用模板定义对于某个类型可能是完全错误的,或者不能编译,或者做一些错误的事情

 template<class T>
int compare(T t1,T t2)
{
if(t1>t2)
return ;
else if(t1<t2)
return -;
else
return ;
}
int main()
{
char *pStr1="holle";
char *pStr2="world";
cout<<compare(pStr1,pStr2)<<endl;
return ;
}
//结果是1,实际是-1

模板函数特化形式:

1、关键字template后面跟一个空的<>

2、再接模板名和<模板形参>

3、函数形参表

4、函数体

三、模板类

模板类型格式

template<typename p1,typename p2,...,typename p>

class 类名

{...}

eg:
1 template<typename T>
class SeqList
{
private:
T* _Data;
int _size;
int _capacity
}
 //以模板方式实现动态顺序表

 template<typename T>
class SeqList
{
public:
SeqList();
~SeqList();
private:
int _size;
int _capacity;
T* _Data;
};
template<typename T>
SeqList<T>::SeqList()
:_size()
,_capacity()
,_Data(new T[_capacity])
{}
template<typename T>
SeqList<T>::~SeqList()
{
delete []_Data;
}
void FunTest()
{
//SeqList Seq;
SeqList<int>s1;
SeqList<double>s2;
}
//有一种不同的类型编译器就会实类化出对应的一个类

---恢复内容结束---

C++模板&泛型编程的更多相关文章

  1. c++模板 与 泛型编程基础

    C++模板 泛型编程就是以独立于任何特定类型的方式编写代码,而模板是泛型编程的基础. (1)定义函数模板(function template) 函数模板是一个独立于类型的函数,可以产生函数的特定类型版 ...

  2. 论C++与三国

    Scott Meyers曾说过,C++语言是一个语言联邦.C++包含面向过程,面向对象,泛型编程编程思想.现在C++11有加了一堆新特性,语言联邦更为庞大. 程序员们.常常挑起语言之争,甚至连大师级人 ...

  3. C++11--20分钟了解C++11 (下)

    20分钟了解C++11 9 override关键字 (虚函数使用) * * 避免在派生类中意外地生成新函数 */ // C++ 03 class Dog { virtual void A(int); ...

  4. 《C++ Primer Plus》学习笔记 第1章 预备知识

    第一章 预备知识C++在C语言的基础上添加了对"面向对象编程"的支持和对"泛型编程"的支持.类 —— 面向对象模板 —— 泛型编程1.1 C++简介1.2 C+ ...

  5. infos

    C++文件流 iostream 提供了cin cout 分别用于从标准输入读取流和向标准输出写入流cout 标准输出 屏幕 输出写入fstream文件流 cin 从标准输入读取cout 向标准输入写入 ...

  6. C++泛型编程:template模板

    泛型编程就是以独立于任何特定类型的方式编写代码,而模板是C++泛型编程的基础. 所谓template,是针对“一个或多个尚未明确的类型”所编写的函数或类. 使用template时,可以显示的或隐示的将 ...

  7. c++ 泛型编程及模板学习

    泛型编程,英文叫做Generic programming 可以理解为,具有通用意义的.普适性的,编程. 比如,你要实现一个函数去比较两个数值的大小,数值可能是int或者string.初次尝试,我们直观 ...

  8. C++ 模板与泛型编程

    <C++ Primer 4th>读书笔记 所谓泛型编程就是以独立于任何特定类型的方式编写代码.泛型编程与面向对象编程一样,都依赖于某种形式的多态性. 面向对象编程中的多态性在运行时应用于存 ...

  9. 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系

    2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...

随机推荐

  1. PowerShell全自动分配CPU

    代码 $pro = Get-Process foreach ($n in $pro){ if($n.ProcessorAffinity -ne 255){ #continue } if($n.Id - ...

  2. textarea格式显示问题

    在 textarea 表单标签中, 当保存有换行的样式时,一般的方法有: 注:这里的info 为要显示的内容: 一.保存后在textarea 表单标签中显示时: info.replace(/\n/g, ...

  3. 哈哈,修改PHP5.4.44语法成功

    作为一个脚本语言,面向对象的继承基本上不想用到,强类型比较也想使用==直接比较.作为专业程序员不想让PHP解释器代劳过多. 修改了这个MOD版本,效果杠杠的.

  4. iOSDate时间格式(转)

    在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如: //实例化一个NSDateFormatter对象 NSDateForma ...

  5. jQueryAjax笔记

    ajax优点:能在不刷新整个页面的前提下更新数据,使用户操作与服务器响应异步化. ajax缺点:破坏浏览器“前进”.“后退”按钮的正常功能,搜索引擎爬虫不能理解那些奇怪的JS代码和因此引起的页面内容的 ...

  6. 引入Ember插件 大概流程

    引入Ember插件 xxx (转自美女同事 LZX) 1.ember install xxx(过程中可能会提示你安装其他包 按照提示语安装就行)   2.安装之后会看到 工作目录里已经出现了下载好的安 ...

  7. jvm 原理和优化

    在csdn 上看到的,觉得很好,收藏了: 原博文地址: 濤子 http://blog.csdn.net/ning109314/article/details/10411495/ JVM工作原理和特点主 ...

  8. oracle 秒

    select case when  deptno=10 then 'aaaa' when  deptno=20 then 'bbbb' when deptno=30 then 'cccc'     e ...

  9. 如何让电脑公司Win7系统自动关闭停止响应的程序

    在注册表编辑器窗口左侧,依次展开HKEY_CURRENT_USER\ControlPanel\Desktop,选中Desktop,在右边的窗口中选择AutoEndTasks,双击打开AutoEndTa ...

  10. easyui自定义标签 datagrid edit combobox 手动输入保存不上问题解决办法

    使用onEndEdit事件(该事件可以获取到editor对象,onAfterEdit事件获取不到Editor对象) 通过editor拿到输入数据并保存. int ci = 0; for(Column ...