函数模板是什么?

通用函数描述,使用泛型来定义函数,其中的泛型可以用具体的类型来替换,使用函数模板的编程有时候也叫做泛型编程。

知识总结

在标准的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) 。

重载解析

  1. 创建候选函数列表。
  2. 使用候选函数列表创建可行函数列表
  3. 确定是否有最佳的可行函数

在第一步中,锁定同名的函数和函数模板。

在第二步中,创建的都是参数数目正确的函数,有一个隐式转换序列,包括实参类型与形参类型完全匹配的情况。

第三步就是匹配,匹配成功,就可以使用他,匹配不成功,调用报错。

最佳匹配顺序
  1. 完全匹配,但是正常的函数要优于模板函数。
  2. 提升转换
  3. 标准转换
  4. 用户自定义的转化
错误情况

正常请胯下,如果有多个匹配的原型,则编译器无法完成重载解析过程。

如果没有最佳的可行函数,编译器会出现二义性的报错。

ambiguous——二义性

例外

但有些情况下,即使有两个函数完全匹配,却仍旧可以正常的执行。

例如,

  1. 执行非const数据的指针和引用,优先于const指针和引用。
  2. 非模板函数的完全匹配由于模板函数(包括显示具体化)的完全匹配。
  3. 如果两个完全匹配都是模板函数,则较具体的模板函数优先。即显示具体化优于隐式具体化。
    最具体并不一定意味着显示具体化,而是值编译器推断使用哪种类型的时候,执行的转换最少。
#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++函数模板学习总结相关推荐

  1. C++ 函数模板和排序的函数模板——学习笔记

    我们在使用重载函数时,只是使用了函数名,而函数体还是得分别定义,在C++中函数模板为我们很好的解决了这个问题. 1.函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函 ...

  2. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  3. [C++再学习系列] 函数模板和类模板

    函数模板和类模板 C++ 提供类模板和函数模板.函数模板允许重载 ,而类模板不允许重载(类无重载概念).类模板可以进行全特化和偏特化,而函数模板仅能够全特化 .因此,写一个看似函数模板偏特化的函数模板 ...

  4. C++模板学习之函数对象之谓词

    函数对象是用对象来表示的函数: 可以执行operator()的对象都叫做函数对象. 谓词是那些返回bool,operator()操作的函数对象. 考虑如何对一个序列求和: 函数对象的优势在于可以将参数 ...

  5. C++学习笔记35:函数模板

    函数模板 函数模板的目的 设计通用的函数,以适应广泛的数据型式 函数模板的定义格式 template<模板型式参数列表>返回值型式 函数名称(参数列表): 原型:template<c ...

  6. C++学习33 函数模板

    在<C++函数重载>一节中,为了求三个数的最大值,我们通过函数重载定义了三个名字相同.参数列表不同的函数,如下所示: //求三个整数的最大值 int max(int a, int b, i ...

  7. c++面向对象高级编程 学习十一 类模板、函数模板、成员模板

    namespace经验谈: 团队中函数或类的名字可能会冲突,因此使用namespace进行区分. 类模板: template<typename T> 函数模板: template<c ...

  8. c++面向对象高级编程 学习四 静态、类模板、函数模板

    静态static:静态数据和静态函数,在内存中只有一份,不会随着创建对象的数目的增加而增加 static数据:比如银行的account类中,账户名是普通数据,100个对象会有100个账户名,但利率都是 ...

  9. C++模板学习:函数模板、结构体模板、类模板

    C++模板:函数.结构体.类 模板实现 1.前言:(知道有模板这回事的童鞋请忽视) 普通函数.函数重载.模板函数 认识. //学过c的童鞋们一定都写过函数sum吧,当时是这样写的: int sum(i ...

最新文章

  1. html5 微格式,HTML5抢鲜:微格式及相关的属性名称。
  2. gridview格式化日期字段
  3. python入门(三)-- 基本运算符
  4. FM之SO_DOCUMENT_SEND_API1
  5. 从RAID看垂直伸缩到水平伸缩的演化
  6. 电厂运维的cis数据_科技驱动升级,各类智慧电厂技术大盘点
  7. 关于创建 LINQ to SQL 类时无法转换复数的问题(zhuan)
  8. html里面布局的优劣,HTML与CSS布局技巧总结
  9. 初入行的C++程序员,如何快速摆脱CRUD阶段?
  10. sip网络电话 用户一直注册超时无法注册成功
  11. 把握新航道,CSDN智能汽车技术路线图正式发布
  12. tinyTorrent: 从头写一个 Deno 的 BitTorrent 下载器
  13. Ubuntu-阿里云搭建Gitlub
  14. 多款AGV模型3D图纸 零件图,装配图都有 潜伏式,搬运AGV,内部结构详细
  15. 我上传了一个图片 谁知道我上传哪去了 找不见了
  16. GBase XDM集群服务配置
  17. 矩阵乘法——矩阵快速幂
  18. javascript实现小米搜索框
  19. 南开大学计算机本科论文,南开大学本科(论文)模板.doc
  20. aicloud服务器不稳定,华硕AC级无线路由器搭载AiCloud上市

热门文章

  1. 鸿蒙系统全球发布,原创丨新一代鸿蒙正式发布,中国人自己的操作系统来了
  2. nike空军一号AF1多少钱一双
  3. go 实现发送短信验证码登录
  4. 大学生职业生涯规划书
  5. 华为OD机试 - 积木最远距离(Java JS Python)
  6. 大学生抗疫逆行者网页作业 感动人物HTML网页代码成品 最美逆行者dreamweaver网页模板 致敬疫情感动人物网页设计制作
  7. 大家的初级日语一“动词ない型”
  8. C陷阱与缺陷(一)词法“陷阱”、语法“陷阱”
  9. JSR-303(*)
  10. 回溯算法在点菜中的应用例子