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

题外话:

  模板机制的设计和细节是由Bjarne Stroustrup在其1988年10月发表的名为“Parameterized Types for C++”一文中披露的。

引入:

  假设有两个类

  

 它们的结构完全相同,差别就是数据类型int与double,因此我们可以引入下图结构表示:

在建立对象时用实参int或double代入形参T即可,这种做法成为参数化,即是将数据类型作为参数传递,用以替代形参T的实参可以是预定义数据类型或用户自定义数据类型(主要是类的对象),这是参数化的多态性。

详解:

一  函数模板 

  

   上图定义了函数模板,主函数建立了三个模板函数,其中sq(i)使用 int 类型将类型形参 T实例化,sq(l)使用 long 型使形参T实例化,sq(5.55)则是double型。

  由此可见,在函数模板中使用类型参数 T 作为形参,这不是具体函数而是函数的抽象。等到进行实例化,即代入具体类型实参例如int、double等以后,就建立了具体函数,被称为模板函数。

二,函数模板的重载

 

由结果明显可以看出,max(i,j),max(d,f),max(ch,hc)重载的为模板函数,max(d,j),max(i,d),max(ch,f)则调用的重载函数,注意下max(i,j),i,j同为int类型,max(d,f),d,f同为double型,ch,hc则同为char,我们返回查看函数并未发现与之相匹的重载函数,而max(d,j),max(i,d),我们在找到了与其匹配的重载函数,其恰巧也是调用的相应重载函数,但对于max(ch,f),ch为char类型,f为double的类型,首先程序中没有与之匹配的重载函数,也无匹配的函数模板,肿么办?程序显示了其调用了void max(int a, double b),我们不禁疑惑,为什么它不调用void max(double b, int a),而偏偏调用前一个函数,细观察另个函数的形式参数,不难发现void max(int a, double b),第二个形式参数为double类型,与f为同一类型,相比void max(double b, int a)更为接近,为什么会这样呢?查看调用的规则,我们会发现在混合使用重载的函数和模板时,应当避免二义性。此时它们的调用顺序是:

1.先调用匹配的重载函数

2.      如无匹配的重载函数,则调用匹配的函数模板。如果找到,则将其实例化,建立一个模板函数

3.      如再匹配不上,则调用相近的重载函数,此时可能丢失精度。

因此,可粗略地归纳为:先重载,再模板,后相近。

三 重载函数与函数模板都属于多态性机制,它们的区别如下:

(1)主函数调用重载函数和模板函数的格式完全相同。

  重载函数的优点是能够对不同数据类型使用不同程序逻辑进行类似操作。例如用于求取int或double的最大值的程序逻辑和操作就和求取char或char*的最大值的程序逻辑和操作差别很大。而函数模板无法处理。

  如果每种数据类型的程序逻辑和操作相同,则使用函数模板将会更加简洁和方便。

  模板是一种代码产生机制。

(2)对于重载函数,无论它们使用与否,全部都存于代码区中,都占用空间。

而对于函数模板,只当使用一个具体参数类型时才建立一个模板函数,而当使用另一个具体参数类型时再建立另一个模板函数。编程方便,使用灵活,效率较高。

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

『c++』 模板(template)--- 参数化多态性的更多相关文章

  1. 『WPF』DataGrid的使用

    原文 『WPF』DataGrid的使用 几点说明 这里主要是参考了MSDN中关于DataGrid的说明 这里只会简单说明在WPF中,DataGird最简单的使用方法 对于MSDN中的翻译不会很详细,也 ...

  2. 『片段』OracleHelper (支持 多条SQL语句)

    C# 调用 Oracle 是如此尴尬 >System.Data.OracleClient.dll —— .Net 自带的 已经 过时作废. >要链接 Oracle 服务器,必须在 本机安装 ...

  3. 『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现

    『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现 1.基本设定和软件版本 主机名 ip 对应角色 mas ...

  4. 『AngularJS』$location 服务

    项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...

  5. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  6. JS 中通过对象关联实现『继承』

    JS 中继承其实是种委托,而不是传统面向对象中的复制父类到子类,只是通过原型链将要做的事委托给父类. 下面介绍通过对象关联来实现『继承』的方法: Foo = { // 需要提供一个 init 方法来初 ...

  7. 『摄影欣赏』16幅 Romantic 风格照片欣赏【组图】

    今天,我们将继续分享人类情感的系列文章.爱是人类最重要的感觉,也可能是各种形式的艺术(电影,音乐,书,画等)最常表达的主题 .这里有40个最美丽的爱的照片,将激励和给你一个全新的视觉角度为这种情绪.我 ...

  8. 『开源』Slithice 2013 服务器集群 设计和源码

    相关介绍文章: <『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布> <『集群』001 Slithice 服务器集群 概述> <『集群』002 Sli ...

  9. 『设计』Laura.Compute 设计思路

    前言: 前一篇文章 <『开源』也顺手写一个 科学计算器:重磅开源> ,继 Laura.Compute 算法开源之后,有 博客园 园友 希望公开一下 Laura.Compute算法 的 设计 ...

随机推荐

  1. python统计元素重复次数

    python统计元素重复次数 # !/usr/bin/python3.4 # -*- coding: utf-8 -*- from collections import Counter arr = [ ...

  2. JVM内存模型和性能优化 转

    JVM内存模型和性能优化 JVM内存模型优点 内置基于内存的并发模型:      多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于 ...

  3. javascript 利用匿名函数对象给你异步回调方法传参数

    先来创建一个匿名函数对象: /*** * 匿名函数 */ var callChangeBtn=new function(bugBtn){ this.chage=function(json){ bugB ...

  4. C++STL算法函数总结

    容器自己定义了的算法vector:swaplist:swap,merge,splice,remove,remove_if,reverse,uniquedeque:swapmap,set,multise ...

  5. System.Data.OleDb操作access数据库类,【bubuko.com】

    access数据库在应用了System.Data.OleDb后操作会很方便,这是一个常用的数据库操作类,其中两个方法,一个是返回datatable的,一个是执行sql语句返回影响记录的(一般是inse ...

  6. mybatis实战教程(mybatis in action)之六:与Spring MVC 的集成

    前面几篇文章已经讲到了mybatis与spring 的集成.但这个时候,所有的工程还不是web工程,虽然我一直是创建的web 工程.今天将直接用mybatis与Spring mvc 的方式集成起来,源 ...

  7. Ubuntu开启22端口

    [http://blog.csdn.net/baple/article/details/39288817] 安装OpenSSH Ubuntu缺省没有安装SSH Server,使用以下命令安装: sud ...

  8. vue.js 1中父组件跳到子组件中并传参让子组件显示不同的内容

    父组件中的点击跳转: <ul class="insurance-entry clearfloat"> <li v-link="{name:'produc ...

  9. Windows 驱动程序工具包中的头文件

    MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff554695(v=vs.85).aspx Windows 驱动程序 ...

  10. Google公布了禁用Chrome插件后的新解决方案

    chrome://flags/#enable-npapi 启用npapi后重启chrome,再打开 chrome://plugins/