模板类 Template Classes 以及模板类编译时的处理



        我们可以建立template classes,使它们能够神奇地操作任何类型的资料。下面这个例子是让CThree 类别储存三个成员变量,成员函数Min 传回其中的最小值,成员函数Max 则传回其中的最大值。我们把它设计为template class,以便这个类别能适用于各式各样的数据类型:

 template <class T>class CThree{public :CThree(T t1, T t2, T t3);T Min();T Max();private:T a, b, c;};

      语法还不至于太稀奇古怪,把T 看成是大家熟悉的int 或float 也就是了。下面是成员函数的定义:

  template <class T>T CThree<T>::Min(){T minab = a < b ? a : b;return minab < c ? minab : c;}template <class T>T CThree<T>::Max(){T maxab = a < b ? b : a;return maxab < c ? c : maxab;}template <class T>CThree<T>::CThree(T t1, T t2, T t3) : a(t1), b(t2), c(t3){return;}


        这里就得多注意些了。每一个成员函数前都要加上template <class T>,而且类别名称应该使用CThree<T>。

//以下是template class 的使用方式:#include <iostream.h>void main(){CThree<int> obj1(2, 5, 4);cout << obj1.Min() << endl;cout << obj1.Max() << endl;CThree<float> obj2(8.52, -6.75, 4.54);cout << obj2.Min() << endl;cout << obj2.Max() << endl;CThree<long> obj3(646600L, 437847L, 364873L);cout << obj3.Min() << endl;cout << obj3.Max() << endl;}

执行结果如下:
  2 5
-6.75
8.52
364873
646600

     对程序员而言C++ templates 可说是十分容易设计与使用,但对于编译器和联结器而言却是一大挑战。编译器遇到一个template 时,不能够立刻为它产生机器码,它必须等待,直到template 被指定某种类型。从程序员的观点来看,这意味着template function 或template class 的完整定义将出现在template 被使用的每一个角落,否则,编译器就没有足够的信息可以帮助产生目的码。当多个源文件使用同一个template 时,事情更趋复杂。
     随着编译器的不同,掌握这种复杂度的技术也不同。有一个常用的技术,Borland 称之为Smart,应该算是最容易的:每一个使用Template 的程序代码的目的档中都存在有template码,联结器负责复制和删除。
     假设我们有一个程序,包含两个源文件A.CPP 和B.CPP,以及一个THREE.H(其内定义了一个template 类别,名为CThree)。A.CPP 和B.CPP 都包含THREE.H。如果A.CPP以int 和double 使用这个template 类别,编译器将在A.OBJ 中产生int 和double 两种版本的template 类别可执行码。如果B.CPP 以int 和float 使用这个template 类别,编译器将在B.OBJ 中产生int 和float 两种版本的template 类别可执行码。即使虽然A.OBJ 中已经有一个int 版了,编译器没有办法知道。然后,在联结过程中,所有重复的部份将被删除。









本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

行转列及列转行查询

开发过程中常遇到行转列或是列转行的问题&#xff0c;即需要将数据库中一张表信息进行行转列操作&#xff0c;再将每列&#xff08;即每个字段&#xff09;作为与其他表进行联表查询的字段进行显示。 一、行转列&#xff1a;将原来同一列下多行的不同内容作为多个字段&#xff…

一、Java语言基础(4)_方法和数组——数组

2018-04-25 不悔梦归处&#xff0c;只恨未尽心 数组 一、一维数组 数组的含义&#xff1a;具有相同类型的多个变量按有序形式组织起来的数据形式。&#xff08;数组是用来存储固定大小的同类型元素。&#xff09;数组的定义&#xff1a;方式1&#xff08;推荐使用&#xff09;&…

create_metrology_model创建测量几何形状所需的数据结构(原理)

目录create_metrology_model&#xff08;算子&#xff09;描述二维计量的基本原理创建计量模型数据结构提供近似值修改模型参数修改对象参数对齐计量模型应用测量访问结果清理记忆注意参数create_metrology_model&#xff08;算子&#xff09; create_metrology_model - 创建测…

iOS开发UI篇—字典转模型

一、能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 1 //2 // LFViewController.m3 // 03-应用管理4 //5 // Created by apple on 14-5-22.6 // Copyright (c) 2014年 heima. All rights reserved.7 //8 9 #import "LFViewController.h" 10 11 i…

Codechef:Path Triples On Tree

Path Triples On Tree 题意是求树上都不相交或者都相交的路径三元组数量。 发现blog里没什么树形dp题&#xff0c;也没有cc题&#xff0c;所以来丢一道cc上的树形dp题。 比较暴力&#xff0c;比较恶心 #include<cstdio> #include<algorithm> #define MN 300001 #de…

grbl

第一次发帖...之前上论坛都是查资料的&#xff0c;发现gcode这一块资料比较少先说一下Gcode:Gcode在工业控制上用的很多&#xff0c;是一种通用的控制指令&#xff0c;数控机床上经常用&#xff0c;在我diy雕刻机&#xff08;打印机之类的&#xff09;的时候要用到&#xff0c;…

mybitis实现增,删,改,查,模糊查询的两种方式:(2)

方式二&#xff1a;mapper代理接口方式 这种方式只需要xml接口&#xff08;不用写实体类&#xff09;但是需要符合三个规范 使用mapper代理接口方式在同一目录下&#xff08;可以创建一个源文件夹&#xff0c;达到类文件和xml文件分类的作用&#xff09;xml中namespace&#xf…

C语言中的静态函数的作用

转载 在C语言中为什么要用静态函数(static function)&#xff1f;如果不用这个static关键字&#xff0c;好象没有关系。那么&#xff0c;用了static以后&#xff0c;有什么作用呢&#xff1f;我们知道&#xff0c;用了static的变量&#xff0c;叫做静态变量&#xff0c;其意义是…

c++11 原子类型与原子操作

1、原子类型和原子操作&#xff08;1&#xff09;类型&#xff08;2&#xff09;操作&#xff08;3&#xff09;详述● 原子类型只能从其模板参数类型中进行构造&#xff0c;标准不允许原子类型进行拷贝构造、移动构造&#xff0c;以及使用operator等● atomic_flag 是一个原子…

依弗科(上海)机电设备有限公司

机器人喷涂倒计时&#xff0c;上帝帮我实现愿望吧 阿门 &#xfeff;&#xfeff;&#xfeff;&#xfeff;

CoDeSys

&#xfeff;&#xfeff;CoDeSys是全球最著名的PLC内核软件研发厂家德国的3S&#xff08;SMART&#xff0c;SOFTWARE&#xff0c;SOLUTIONS&#xff09;公司出的一款与制造商无关的IEC 61131-1编程软件。CoDeSys 支持完整版本的IEC61131标准的编程环境&#xff0c;支持标准的六…

使用halcon结合机械XY轴对相机进行9点标定

小哥哥小姐姐觉得有用点个赞呗&#xff01; 先在halcon中计算仿射变换矩阵并验证 //在图像中找到的模板中心位置 PicX:[1680.721,2065.147,911.499,526.798,1290.920,1285.731,1300.953] PicY:[968.321,964.366,976.283,980.035, 587.055,394.727,1355.487] //与图像中查找…

Ubuntu Linux 提出新的发布模式——测试周

2019独角兽企业重金招聘Python工程师标准>>> 导读开源技术项目最大的优势之一就是社区的每个人都可以自由地提出想法&#xff0c;如果获得社区支持&#xff0c;它可以变成现实。著名的 Ubuntu 开发人员 Simon Quigley 就提出了一个可能改变 Ubuntu Linux 开发过程的…

【转】小白级的CocoaPods安装和使用教程

原文网址&#xff1a;http://www.jianshu.com/p/e2f65848dddc 百度有很多CocoaPods的安装教程.第一次看的时候,确实有点摸不透的感觉.经过思考,一步一步来实践,前后花了三十几分钟,才顺利使用..所以想了想,我还是写一个小白级的教程吧.细到每一个细节都说明. 让你不用10分钟解决…

常见错误总结

少打头文件 少打using namespace std; 命名冲突&#xff0c;全局变量与局部变量命名一致&#xff0c;导致使用的值不是期望值 边读边写&#xff0c;导致改后读&#xff0c;覆盖写入的值 长整数移位溢出&#xff0c;1<<63是错误的&#xff0c;应该写成1ll<<63 循环变…

HALCON相机标定相机内参相机外参

目录相机标定1.相机标定是什么2.怎么使用halcon进行相机内外参标定&#xff1f;&#xff08;1&#xff09;搭建硬件1.**相机连好电脑&#xff0c;用相机厂家软件打开相机&#xff0c;检查一下相机是否正常。**2.**接下来使用halcon连接相机**&#xff08;2&#xff09;开始标定…

angular change the url , prevent reloading

http://stackoverflow.com/questions/14974271/can-you-change-a-path-without-reloading-the-controller-in-angularjs $location.search({vln: $scope.vln_id}, false);会改变url中 &#xff1f; 后面的 搜索参数&#xff0c;但是controller不会重新实例化。angular 官方文档…

C#圆形卡尺测量程序基于halcon

废话不多说上源码 觉得帖子有用给点个赞哈 先来个效果图 下边的是源码&#xff0c;自己新建一个文件粘贴进去&#xff0c;包含到您现在的项目 中。这串源码后边是使用方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin…

科维PLC运行时系统ProConOS embedded CLR 2.2 特定应用

ProConOS embedded CLR是新型的开放式标准化PLC运行时系统&#xff0c;符合IEC 61131标准&#xff0c;可执行不同的自动化任务&#xff08;PLC、PAC、运动控制、CNC、机器人和传感器&#xff09;。   通过采用国际标准的微软中间语言&#xff08;依据IEC/ISO 23271标准为MSIL…

set()与get()详细解答(C#)

这几天在搬砖时候用到了set()与get()&#xff0c;同事问了我一些问题&#xff0c;我打算在博客中总结一下。 觉得帮助到了您&#xff0c;帮我点个赞哦。 属性访问器 其实说白了就是操作一个属性&#xff0c;更通俗一点说就是对一个变量的取值与赋值。 先来看get() get 访问…