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;
}
c/c++ 函数模板初探的更多相关文章
- 25.C++- 泛型编程之函数模板(详解)
本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数和函数模板 当我们想写个Swap()交换函数时,通常这样写: void Swap(int& a, int&am ...
- C++中函数模板的概念和意义
1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数 模板和类模板就是 C++ 中泛型编程技术,本 ...
- c++函数模板作为类的成员函数,编译报错LNK2019的解决方法
为了使某个类的成员函数能对不同的参数进行相同的处理,需要用到函数模板,即template<typename T> void Function(). 编译时报错LNK2019 解决方法: 1 ...
- C++STL - 函数模板
模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...& ...
- 使用getopt_long来解析参数的小函数模板
getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...
- C++函数重载和函数模板
1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);flo ...
- 零值初始化&字符串常数作为函数模板参数
1.在定义一个局部变量时,并希望该局部变量的初始化一个值,可以显示调用其默认构造函数,使其值为0(bool类型默认值为false). template <typename T> void ...
- 让gcc支持成员函数模板的trick
让gcc支持成员函数模板的trick 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议 gcc 4.7.3 不支持成员 ...
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
[源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...
随机推荐
- gops —— Go 程序诊断分析工具
GitHub: https://github.com/google/gops 一个用于列出和诊断分析系统中正在运行的 Go 程序的命令行工具 安装 go get -u github.com/googl ...
- Perl检查引用类型
有时候可能会需要检查引用是什么类型的,免得我们期待是一个数组引用,却给了一个hash引用. ref函数可以用来检查引用的类型,并返回类型.perl中内置了如下几种引用类型,如果检查的不是引用,则返回u ...
- (2)编译安装lamp三部曲之mysql-技术流ken
简介 采用yum安装lamp简单,快捷,在工作中也得到了普遍应用.但是如果我们需要某些特定模块功能,以及制定安装位置等,就需要用到编译安装了,接下来将编译安装lamp之mysql. mysql的简介网 ...
- springMVC_04controller四种配置总结
一.通过url对应bean,加粗部分为必须有的 <bean class=" org.springframework.web.servlet.handler.BeanNameUrlHan ...
- fork/join 全面剖析
fork/join作为一个并发框架在jdk7的时候就加入到了我们的java并发包java.util.concurrent中,并且在java 8 的lambda并行流中充当着底层框架的角色.这样一个优秀 ...
- Mybatis框架可视化(1)
Mybatis整体架构视图: 接 口 层 SqlSession (定义了Mybatis暴露给应用程序调用的API) 核 心 处 理 层 配置解析 (加载核心配置.映射配置. mapper接口注解信息, ...
- MyBatis中映射器Mapper概述
MyBatis真正强大之处在于它的映射器.因为它异常强大并且编写相对简单,不仅比传统编写SQL语句做的更好并且能节省将近95%的代码量 XML中顶级元素汇总 cache: 给定命名空间的缓存配置 ca ...
- 谈谈 final finally finalize 区别
声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...
- PHP7.27: pdf
http://www.fpdf.org/ https://github.com/Setasign/FPDF https://www.ntaso.com/fpdf-and-chinese-charact ...
- vue从入门到进阶:vue-router路由功能(九)
基本使用 html: <script src="https://unpkg.com/vue/dist/vue.js"></script> <scrip ...