C++ 实用泛型编程之设计通用型程序(模板)杂谈

上一节中我们讲到用基类做参数,可以实现不用判断子类对象类型,就能调用到对应的函数。

如果我们要设计一个堆栈,不管传入的数据类型,例如整形或字符型,都可以正确的处理,我们要怎么做呢?当然传统的方法我们也可以实现,但是不太好做,比较麻烦。现在我们来介绍一下更通用的一个方法。C++ STL提供了容器(Container),现在我们来看下容器stack怎么实现的。

template<typename T>

class Stack

{

public:

~Stack(){}

Stack(int _i):m_iCur(0),m_iMaxSize(0)

{

m_iMaxSize=_i;

v=new T[m_iMaxSize];

}

void push(T _param)

{

v[m_iCur]=_param;

cout<<"push "<<v[m_iCur]<<endl;

m_iCur++;

}

T pop()

{

if(m_iCur >= 0)

{

m_iCur--;

cout<<"pop "<<v[m_iCur]<<endl;

return v[m_iCur];

}

}

public:

T* v;

int m_iMaxSize;

int m_iCur;

};

这里注意一下模板类的写法:template<typename T> 。

在Stack类中定义了构造函数和两个操作函数push、pop,还有三个成员变量:

T* v; //定义一个指针存放数据

int m_iMaxSize; //容器最大值

int m_iCur;  //当前游标

在使用函数中写如下代码。

Stack<int> sc(5);

Stack<TCHAR> str(5);

for (int i = 0; i < sc.m_iMaxSize; i++)

{

sc.push(i);

TCHAR *s=new TCHAR[iSize];

_itot_s(i,s,iSize,10);

ps[i]=i;

str.push(*s);

}

for (int i = 0; i < sc.m_iMaxSize; i++)

{

int iItem=sc.pop();

str.pop();

}

这个Stack实例使用了int、TCHAR做为测试。

运行结果如下:

Push 0,1,2,3,4,pop 4,3,2,1,可以这到这是先进后出(FILO)的顺序。

有人可能会问用T的这种写法会不会有额外的运行时开销,其实不会的,template是一种编译时的机制。

有了Template的概念,我们可以设计一个copy函数,它不会受到类型的限制,参考如下代码。

template <typename In,typename Out> void my_copy(In begin, In end, Out dest)

{

do

{

*dest = *begin;

++dest;

++begin;

}while (begin != end);

}

使用字符串和整形数字来测试,

TCHAR  str1[10]={_T("English")};

TCHAR  str2[10];

my_copy(&str1[0], &str1[10], &str2[0]);

_tprintf(_T("%s\n"),str2);

int i1[6]={1,2,3,4,5,6};

int i2[6];

my_copy(&i1[0], &i1[10], &i2[0]);

TCHAR *s=new TCHAR[iSize];

for each (int i in i2 )

{

_tprintf(_T("%d\n"),i);

}

运行结果:

把对象传入也可以拷贝。

TestA A;

TestA B;

A.m_iData=1;

my_copy(&A,&A+1,&B);

cout<<"B.m_iData"<<B.m_iData<<endl;

运行结果:

时间: 2024-10-12 08:12:08

C++ 实用泛型编程之设计通用型程序(模板)杂谈的相关文章

ASIC设计中一种通用型并行设计方法

我是个"低调"的人,总不喜欢表达出来,对异性如此,对工作也是如此.在翔哥的鼓励下,决定把自己工作的一些经验和思考写下来,和同道们一起分享. ASIC设计中一种通用型并行设计方法: 1)流水网的概念提出 IC设计中的控制有串行和并行两种思想.状态机方法反应了串行控制思想,有软件的思路,比较好理解,新手比较喜欢用.流水线方法是并行处理的思想,比较抽象,因为其效率高,老手喜欢用.从"流水线"的名字就容易知道,它只是一维的一条线,一个设计中可以有很多条.小设计中可能很容易设

通用访问 - 用“反射”来设计通用的通信协议

1. 效果演示 2. 通信协议 功能介绍 特点 TCP协议 WebApi协议 3. SDK与工具 4. 应用示例 迷你网管 通用GIS 系统管理 5. 设计初衷与演化 1. 效果演示 服务端代码 //创建服务器 var __服务端 = FT通用访问工厂.创建服务端(); __服务端.端口 = 8888; __服务端.开启(); //实际对象 var __基本状态 = new M基本状态(); __基本状态.版本 = "1.0.0.0"; __基本状态.待处理问题.Add(new M问题

通用型动态数组的总结

基本数据结构之-通用型动态数组 动态数组的应用主要是对于长度未知的数组,先开辟一段空间来存储数据,当空间不够时,在开辟两倍的空间来存储数据 和普通数组的区别就是,我们可以不用关心数组的长度的问题,唯一需要关注的就是数据的类型是自定义数据类型还是基本数据类型,但是不论是基本数据类型还是自定义的数据类型,都需要自定义两个函数,这两个函数时遍历(打印)函数和比较函数,因为,在传递的是地址,没法再里面判断是什么类型,只能交给使用者去定义它的想关的函数, 先说基本的结构: 为了适应更多的数据类型,我们存储

当前一种先进实用的架构设计

目录 1系统架构图...1 2架构设计...3 2.1项目开发环境...3 2.2运行环境要求:...3 2.3 服务器架构平台:...4 2.4.架构逻辑设计...5 2.4.1 LVS+KEEPLIVED+SQUID+HAPROXY+JBOSS集群...5 2.4.2mysql集群...6 2.4.3fastdfs图片服务器集群...8 2.4.4acveMQ服务器集群...8 3 架构剖析...10 3.1负载均衡器解析...10 3.2 lvs解析...11 3.3keeplived解析

我的php学习笔记:php通用采集程序

php采集程序构建基本步骤: 采集程序是什么?获取远程数据(文字.图片.图片)并快速保存到本地或指定地址. 如天气预报(小偷程序): 远程获取-->替换内容-->展示给用户 如实时更新的新闻(采集内容): 远程获取-->提取内容-->分类存储-->读取内容--->展示内容 ************************* 设计PHP采集入库UML 列表正则: 终端正则: ************************** file_get_contents()获取远

通用型硬件只是个传说

[TechTarget中国原创]世界上并不存在什么通用型存储硬件(Commodity Storage Hardware).当然你可以选择去相信那些软件定义存储厂商的一面之词,但即使他们承认确实有这样的硬件,他们或许也会不希望让自己的产品运行在这上面. 尽管如此,软件定义存储(SDS)仍然尝试用这种荒诞不经的理论来引诱新的使用者:即硬件其实并不重要,因为他们的软件可以搞定一切.确实市场上有许多可靠.创新的SDS产品可以满足许多企业购买服务器以及存储的需求.但是就此将硬件打上通用型的标签——以揭示其

php开发通用采集程序

php采集程序构建基本步骤: 采集程序是什么?获取远程数据(文字.图片.图片)并快速保存到本地或指定地址. 如天气预报(小偷程序): 远程获取-->替换内容-->展示给用户 如实时更新的新闻(采集内容): 远程获取-->提取内容-->分类存储-->读取内容--->展示内容 ************************* 设计PHP采集入库UML       列表正则:       终端正则: ************************** file_get_c

Android应用安全之Android APP通用型拒绝服务漏洞

0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应用中使用了getSerializableExtra() 的API,由于应用开发者没有对传入的数据做异常判断,恶意应用可以通过传入畸形数据,导致应用本地拒绝服务.漏洞应用代码片段: Intent i = getIntent(); if(i.getAction().equals("serializabl

解析大型.NET ERP系统 设计通用Microsoft Excel导入功能

做企业管理软件很难避免与Microsoft Excel打交道,常常是软件做好了,客户要求说再做一个Excel导入功能.导入Excel数据的功能的难度不大,从Excel列数据栏位的取值,验证值,再导入到数据库表中.然而一直是在做重复工作,写过不计其数的Excel导入程序,每次只是满足于问题解决,后来终于找到一个方法,实现通用的Excel数据导入. 设计通用的Excel导入功能,第一个实现要求是不能依赖Excel,客户的电脑或服务器很有可能没有安装Excel,所以微软的Office Interop一