c/c++ 函数模板实例讲解与分析
时间:2018-08-20
本文章向大家介绍c/c++ 函数模板实例讲解与分析,需要的朋友可以参考一下
函数模板初探
1,由来:有时候,函数的逻辑是一样的,只是参数的类型不同,比如下面
int Max(int a, int b){
return a > b ? a : b;
}
double Max(double a, double b){
return a > b ? a : b;
}
2,解决办法,如果参数的类型也可以作为函数的参数,就可以解决了
T Max(T a, T b){
return a > b ? a : b;
}
3,函数模板写法:template<typename T1,typename T2, ...>
4,函数模板的效率不高,编译器在编译的时候,会根据调用测提供的参数去推导出T1等的类型,并给我们生成对应类型的方法。
5,下面的例子,调用的时候,可以明确给定参数的类型,Max<int>(1, 2.1),这样一来,即使1和2.1的类型不同,编译也可以通过,如果只用Max(1, 2.1),编译就不会通过,当然如果 Max(T1 a, T2 b),也可以解决问题。
6,typeid(T).name() 返回T的类型的名字
#include <iostream>
#include <typeinfo>
using namespace std;
class Test{
friend ostream& operator<<(ostream &os, const Test &t);
public:
Test(int d = 0) : data(d){}
bool operator>(const Test &t){
return data > t.data ? true : false;
}
~Test(){}
private:
int data;
};
ostream& operator<<(ostream &os, const Test &t){
os << "Test::data : " << t.data;
return os;
}
template<typename T>
T Max(T a, T b){
cout << typeid(T).name() << endl;
return a > b ? a : b;
}
int main(){
cout << Max(1, 2) << endl;
cout << Max('A', 'B') << endl;
cout << Max(1.2f, 3.4f) << endl;
cout << Max(1.2, 3.4) << endl;
Test t(10);
Test t1(11);
cout << Max(t, t1) << endl;
//编译不过,因为1和2.1的类型不同,但是模板函数的两个参数的类型是相同的,所以编译器不知道用哪种类型作为函数的参数了。
//cout << Max(1, 2.1) << endl;
cout << Max(1, (int)2.1) << endl;
cout << Max((double)1, 2.1) << endl;
cout << Max<int>(1, 2.1) << endl;
cout << Max<double>(1, 2.1) << endl;
cout << Max<>(1, 2) << endl;
}
- 37个TOP实例命令,超过一半你肯定都没见过
- 利用TensorFlow生成图像标题
- 保存并加载您的Keras深度学习模型
- 简单、通用的JQuery Tab实现
- Dubbo源码解析 - 远程暴露
- 使用FastText(Facebook的NLP库)进行文本分类和word representatio...
- 声音分类的迁移学习
- 【死磕Java并发】—– J.U.C之AQS:CLH同步队列
- 使用Python完成你的第一个学习项目
- CA,给了数据库,给了机器,为啥也扩不了容?
- 如何使用Anaconda设置机器学习和深度学习的Python环境
- MQ,互联网架构解耦神器
- 预测随机机器学习算法实验的重复次数
- 服务化了,没想到耦合更加严重?
- 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 数组属性和方法
- 在网页中常用到的几种居中方法
- 秋招面经三(作业帮、新浪、阿里云)
- 初识HTML
- iOS 点击按钮复制文本
- AntUI滑块Sliders
- AntUI卡片Cards
- AntUI常规Forms表单
- 二叉树:看看这些树的最大深度
- C++核心准则SF.5: .cpp文件必须包含定义它接口的.h文件
- C++核心准则SF.6:(只)为转换,基础库或在局部作用域内部使用using namspace指令
- C++核心准则SF.7:不要在头文件中的全局作用域中使用using namespace指令
- 二叉树:看看这些树的最小深度
- Hive初体验
- Hive数据的存储以及在centos7下进行Mysql的安装
- 一个改进的数学学习工具