16.1
如果我们希望写一个函数实现比较两个数值的大小,相等则返回0,较小返回-1,较大返回1,可能会写如下的函数:
1 int compare(const string &v1, const string &v2) { 2 if(v1 < v2) return -1; 3 if(v2 < v1) return 1; 4 return 0; 5 }
虽然我们可以传入不同的参数,但是由于参数类型是固定的,所以只能传入int类型的值,如果想比较double或其他类型的值,就得写一个其他类型的重载版本:
1 int compare(const double &v1, const double &v2) { 2 if(v1 < v2) return -1; 3 if(v2 < v1) return 1; 4 return 0; 5 }
我们注意到这两个版本的实现除了类型其他都一样。如果为了适配不同的类型而创建具有同样实现的重载函数,不仅难以维护,而且违反了DRP(Don't repeat yourself)原则。那有没有一种方法,创建方法的时候只创建一次,但是又能处理任何类型(预知或不可预知的)的参数。
在C++中,我们可以使用模板来实现该功能。模板,他既不是类也不是函数,就像字面意思一样,只是一个模具,相当于一个公式,是C++支持参数化多态的工具。在经过编译器编译过后,最终还是生成一大堆类型不同的相似函数或类,只不过编译器帮我们做了繁杂的处理。
1.1 函数模板
由此定义一个compare的函数模板,先写模板关键字template, 紧接着尖括号,括号内使用关键字typename/class, 表明T是模板类型。
注意: 模板参数列表不能为空
注意:typename 和 class 实际没有区别。只是class先被引入到语言中。 然而,更建议使用 typename ,因为它更清楚地表明模板类型可以被任何类型(例如基本类型)替换,而不仅仅是类类型。
1 template<typename T> 2 int compare(const T &v1, const T &v2) { 3 if(v1 < v2) return -1; 4 if(v2 < v1) return 1; 5 return 0; 6 }
实例化函数模板
函数模板并不是函数,但是它只生成函数。
1 #include <iostream> 2 3 template <typename T> 4 int compare(const T &v1, const T &v2) { 5 if (v1 < v2) return -1; 6 if (v2 < v1) return 1; 7 return 0; 8 } 9 10 int main() { 11 std::cout << compare(1, 0) << std::endl; //-->int compare(const int &v1, const int &v2) 12 return 0; 13 }
当编译器遇到compare(1, 0)时,如果没有发现匹配的compare(int, int)的函数定义,就会使用compare<T>函数模板来创建一个参数类型为int的compare函数。
从函数模板创建函数的过程就叫实例化。
模板类型参数与非类型模板参数
模板中的T不仅
原文地址:https://www.cnblogs.com/y4247464/p/15149306.html
- 腾讯乘车码走进浙江宁波,微信扫码乘车服务范围再扩大
- Spring MVC 基于Method的映射规则(注解版)
- 程序员需要知道的8个Linux命令
- 学好webpack,一名前端开发工程师的自我修养
- 活动安排问题--贪心算法
- Spring MVC 基于URL的映射规则(注解版)
- Ruby中如何识别13位的时间戳
- 小瓜牛漫谈 — String
- [logstash-input-http] 插件使用详解
- 在Elasticsearch中查询Term Vectors词条向量信息
- 使用asp调用.net xml web services
- 数组乘积--满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出
- 锋利的JQuery —— 选择器
- 套接字选项
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux中没有rc.local文件的完美解决方法
- 详解linux lcd驱动编写
- Linux下安装telnet的方法
- Linux 安装二进制MySQL 及 破解MySQL密码的方法
- Linux创建进程达到65535的方法
- SSH 上传文件及文件夹到linux服务器的方法
- apache tika检测文件是否损坏的方法
- Linux下二进制编译安装MySql centos7的教程
- Linux 6 修改ssh默认远程端口号的操作步骤
- 基于python的Linux系统指定进程性能监控思路详解
- ubuntu下的虚拟环境中安装Django的操作方法
- 详解linux下umask的使用
- Linux下设置每天自动备份数据库的方法
- Linux常用命令之chmod修改文件权限777和754
- 解决CentOS 7升级Python到3.6.6后yum出错问题总结