C++函数模板学习总结
函数模板是什么?
通用函数描述,使用泛型来定义函数,其中的泛型可以用具体的类型来替换,使用函数模板的编程有时候也叫做泛型编程。
知识总结
在标准的C++98添加关键字typename之前,C++使用关键字class来创建函数模板。
// 函数声明,声明时也要用模板的方式
template <typename T>
void Swap(T &a, T &b);
注意函数模板不能缩短可执行程序,最终的代码不包含任何模板,而只包含了为程序生成的实际函数。使用函数模板的好处是,使得生成多个函数定义更加的简单、可靠。
并非所有的模板参数都必须是模板参数类型。
模板函数也可以用来重载。
要注意函数模板的局限性,如对结构进行比较大小等操作时,模板函数可能无法处理某些类型。
具体化
可以提供一个具体化的定义,称为显示具体化。
.对于给定的函数名,可以有:
非模板函数
模板函数
显示具体化模板函数
以及他们的重载类型。
显示具体化的原型和定义应该以:
template<>
开头,并通过名称来指出类型。
优先级关系:
非模板函数 > 显示具体化函数
显示具体化函数 > 常规模板函数
template <typename T>
void Swap(T &, T &);// 显示具体化函数的声明
template <> void Swap<job> (job &, job &);
// 等价于
template <> void Swap<> (job &, job &);
在代码中包含函数模板本身并不会生成函数定义,它只是一个用于函数定义的方案。
最初,编译器只能通过隐式实例化,来使用模板生产函数定义,但现在C++还允许使用显示实例化(explicit instantiation)。
// 显示实例化的声明
template void Swap<int> (int, int);
// 显示具体化的声明
template<> void Swap<int> (int &, int &);
template<> void Swap<> (int &, int &); // 等价
注意:视图在同一个文件(或转换单元)中使用同一种类型的显示实例和显示具体化将出错。
可以通过在程序中使用函数来创建显示实例化。
template<class T>
T Add(T a, T b)
{return a + b;
}int m = 6;
double x = 6.66666;
double ans = Add<double> (x, m);
隐式实例化、显示实例化和显示具体化统称为具体化(specialization) 。
重载解析
- 创建候选函数列表。
- 使用候选函数列表创建可行函数列表
- 确定是否有最佳的可行函数
在第一步中,锁定同名的函数和函数模板。
在第二步中,创建的都是参数数目正确的函数,有一个隐式转换序列,包括实参类型与形参类型完全匹配的情况。
第三步就是匹配,匹配成功,就可以使用他,匹配不成功,调用报错。
最佳匹配顺序
- 完全匹配,但是正常的函数要优于模板函数。
- 提升转换
- 标准转换
- 用户自定义的转化
错误情况
正常请胯下,如果有多个匹配的原型,则编译器无法完成重载解析过程。
如果没有最佳的可行函数,编译器会出现二义性的报错。
ambiguous——二义性
例外
但有些情况下,即使有两个函数完全匹配,却仍旧可以正常的执行。
例如,
- 执行非const数据的指针和引用,优先于const指针和引用。
- 非模板函数的完全匹配由于模板函数(包括显示具体化)的完全匹配。
- 如果两个完全匹配都是模板函数,则较具体的模板函数优先。即显示具体化优于隐式具体化。
最具体并不一定意味着显示具体化,而是值编译器推断使用哪种类型的时候,执行的转换最少。
#include <iostream>using namespace std;template<class T>
T adds(T a, T b, T c)
{return a + b + c;
}template <typename T>
T pows(T a, T b, T c)
{// 乘法int不会自动转化成longlongreturn a * b * c;
}template <class T1, typename T2>
auto try_not_same(T1 a, T2 b) -> decltype(a + b)
{return a + b;
}int main()
{cout << adds(5, 6, 9) << endl;cout << pows(500, 2000, 100000) << endl;cout << try_not_same(4, 4.0) << endl;return 0;
}
总结:当你感觉概念模糊不清的时候,试着写两个例子,你会发现,其实并非你想想的那样困难,这样的设计,有其巧妙之处,你可以学习到很多的知识,最重要的是,你会写了,你下次遇到的时候,不会很害怕了。
C++函数模板学习总结相关推荐
- C++ 函数模板和排序的函数模板——学习笔记
我们在使用重载函数时,只是使用了函数名,而函数体还是得分别定义,在C++中函数模板为我们很好的解决了这个问题. 1.函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函 ...
- C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...
- [C++再学习系列] 函数模板和类模板
函数模板和类模板 C++ 提供类模板和函数模板.函数模板允许重载 ,而类模板不允许重载(类无重载概念).类模板可以进行全特化和偏特化,而函数模板仅能够全特化 .因此,写一个看似函数模板偏特化的函数模板 ...
- C++模板学习之函数对象之谓词
函数对象是用对象来表示的函数: 可以执行operator()的对象都叫做函数对象. 谓词是那些返回bool,operator()操作的函数对象. 考虑如何对一个序列求和: 函数对象的优势在于可以将参数 ...
- C++学习笔记35:函数模板
函数模板 函数模板的目的 设计通用的函数,以适应广泛的数据型式 函数模板的定义格式 template<模板型式参数列表>返回值型式 函数名称(参数列表): 原型:template<c ...
- C++学习33 函数模板
在<C++函数重载>一节中,为了求三个数的最大值,我们通过函数重载定义了三个名字相同.参数列表不同的函数,如下所示: //求三个整数的最大值 int max(int a, int b, i ...
- c++面向对象高级编程 学习十一 类模板、函数模板、成员模板
namespace经验谈: 团队中函数或类的名字可能会冲突,因此使用namespace进行区分. 类模板: template<typename T> 函数模板: template<c ...
- c++面向对象高级编程 学习四 静态、类模板、函数模板
静态static:静态数据和静态函数,在内存中只有一份,不会随着创建对象的数目的增加而增加 static数据:比如银行的account类中,账户名是普通数据,100个对象会有100个账户名,但利率都是 ...
- C++模板学习:函数模板、结构体模板、类模板
C++模板:函数.结构体.类 模板实现 1.前言:(知道有模板这回事的童鞋请忽视) 普通函数.函数重载.模板函数 认识. //学过c的童鞋们一定都写过函数sum吧,当时是这样写的: int sum(i ...
最新文章
- html5 微格式,HTML5抢鲜:微格式及相关的属性名称。
- gridview格式化日期字段
- python入门(三)-- 基本运算符
- FM之SO_DOCUMENT_SEND_API1
- 从RAID看垂直伸缩到水平伸缩的演化
- 电厂运维的cis数据_科技驱动升级,各类智慧电厂技术大盘点
- 关于创建 LINQ to SQL 类时无法转换复数的问题(zhuan)
- html里面布局的优劣,HTML与CSS布局技巧总结
- 初入行的C++程序员,如何快速摆脱CRUD阶段?
- sip网络电话 用户一直注册超时无法注册成功
- 把握新航道,CSDN智能汽车技术路线图正式发布
- tinyTorrent: 从头写一个 Deno 的 BitTorrent 下载器
- Ubuntu-阿里云搭建Gitlub
- 多款AGV模型3D图纸 零件图,装配图都有 潜伏式,搬运AGV,内部结构详细
- 我上传了一个图片 谁知道我上传哪去了 找不见了
- GBase XDM集群服务配置
- 矩阵乘法——矩阵快速幂
- javascript实现小米搜索框
- 南开大学计算机本科论文,南开大学本科(论文)模板.doc
- aicloud服务器不稳定,华硕AC级无线路由器搭载AiCloud上市
热门文章
- 鸿蒙系统全球发布,原创丨新一代鸿蒙正式发布,中国人自己的操作系统来了
- nike空军一号AF1多少钱一双
- go 实现发送短信验证码登录
- 大学生职业生涯规划书
- 华为OD机试 - 积木最远距离(Java JS Python)
- 大学生抗疫逆行者网页作业 感动人物HTML网页代码成品 最美逆行者dreamweaver网页模板 致敬疫情感动人物网页设计制作
- 大家的初级日语一“动词ない型”
- C陷阱与缺陷(一)词法“陷阱”、语法“陷阱”
- JSR-303(*)
- 回溯算法在点菜中的应用例子