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++ ...
随机推荐
- Python爬虫之多线程下载豆瓣Top250电影图片
爬虫项目介绍 本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示: 本次爬虫项目将分别不使用多线程和使 ...
- ASP.NET MVC 学习笔记-2.Razor语法
1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“:”结尾.代码块中定义的变量可能会被同一个域中的其他块使用. ...
- [日常] MySQL数据库持久连接
2018年5月18日 记录: 数据库持久连接: 1.持久的数据库连接是指在脚本结束运行时不关闭的连接.当收到一个持久连接的请求时.PHP 将检查是否已经存在一个(前面已经开启的)相同的持久连接.如果存 ...
- git error: RPC failed; result=56, HTTP code = 200
突然发现git pull 后出现几次都无果,百度后, 发现是curl的postBuffer 默认值较小的原因,配置下这个值,就不会出现该错误了.解决如下: git config --global ht ...
- mongodb与java整合
mongodb与java整合需要用到mongodb驱动,如果是maven环境,则添加如下倚赖: <dependency> <groupId>org.mongodb</gr ...
- JavaScript事件(含Demo)
主要事件: onclick 鼠标单击事件 onmouseover 鼠标经过事件 onmouseout 鼠标移开事件 onchange 文本框内容改变事件 onselect 文本框内容被选中事件 onf ...
- 有哪些Java性能优化方法?
面试官:"有性能优化经验没?" 应聘者:"有一点." 面试官:"那你们从哪些方面做了优化?" 应聘者:"sql优化.JV ...
- PHP无限分类分类导航LINK的代码实现
1. 代码数据库的结构: 2.要达到的效果 /** * @param php无限分类分类导航LINK的代码实现 */ include('db.inc.php'); function getCatePa ...
- 使用laravel框架开发接口时ajax post请求报错419
nginx服务器,使用laravel框架开发后台接口.get请求正常,但是post请求一直报错.H5和APP都不成功,code=419. 解决办法: 找到 VerifyCsrfToken.php文件( ...
- undefined 与 xx is not defined 的区别
undefined 与 xx is not defined 的区别 1. undefined 表示是javascript中的一种数据类型,当被定义的变量没有被赋值或者某个被调用的函数没有定义返回值时候 ...