C++知识点62——模板实参推断与函数模板的特化
一、函数指针与模板实参推断
可以用函数模板初始化一个函数指针或给一个函数指针赋值
示例
template <typename T>
int comp(const T &a, const T &b)
{return 0;
}int main(int argc, char const *argv[])
{int (*pf)(const int &, const int &)=comp;
}
上述代码通过函数指针的形参类型指定了函数模板的模板参数T的类型为int
示例2
void func(int (*pf)(const int &, const int &)){}
void func(int (*pf)(const string &, const string &)){}int main(int argc, char const *argv[])
{func(comp<int>);
}
func是个重载函数,如果把函数模板传入func后,会引起二义性错误,因为此时,编译器无法确定模板参数到底是int还是string,所以需要显示指定模板参数
二、模板参数与引用
如果函数模板的模板参数作为引用类型的形参,那么,当传入一个数组时,形参的类型是数组的引用
示例
template <typename T>
const T & max(const T &a, const T &b)
{cout<<typeid(a).name()<<endl;cout<<typeid(b).name()<<endl;return a>b?a:b;
}int main(int argc, char const *argv[])
{int a[]={1,2,3,4};int b[]={2,3,4,5};::max(a, b);::max("1234", "2345");return 0;
}
这里T被分别推断为int数组和char数组,因为T同时作用于两个形参,且实例化后,形参的类型是数组的引用,所以数组的大小必须相同
如果函数模板的模板参数作为值类型的形参,那么,当传入一个数组时,形参的类型会退化成指针
template <typename T>
const T & max(T a, T b)
{cout<<typeid(a).name()<<endl;cout<<typeid(b).name()<<endl;return a>b?a:b;
}int main(int argc, char const *argv[])
{int a[]={1,2,3,4};int b[]={2,3,4,5};::max(a, b);::max("1234", "2345");return 0;
}
此时,T的类型只是个指针,所以,并不要求数组的大小
上述两点其实并没有什么特别,和以前一样,当我们把一个数组传递给一个类型是数组的引用的形参时,数组不会退化成指针,当我们把一个数组传递给一个类型是数组的形参时,数组形参会变成一个指针
三、const与模板实参推断
如果函数模板的模板参数作为普通形参,那么当传入const类型的实参
template <typename T>
void constest(T a){cout<<typeid(a).name()<<endl;}int main(int argc, char const *argv[])
{const int a=10;constest(a);
}
和之前一样,对于值传递,顶层const会被忽略
虽然传入了const int,但是此时T被指定为int
四、函数模板的特化
类模板可以被特化,函数模板也可以被特化,规则也是在template后面加个<>
示例
template <typename T>
int comp(const T &a, const T &b)
{cout<<typeid(T).name()<<endl;return 0;
}template <>
int comp(const string &a, const string &b)
{return 0;
}
和类模板一样,函数模板特化本质依旧是实例化的一种,并不是重载
和类模板不同的是,函数模板不能局部特化
参考
《C++ Template》
《C++ Primer》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
C++知识点62——模板实参推断与函数模板的特化相关推荐
- 002 模板实参推断、重载与模板
模板实参推断 一.模板函数显示实参 情况1: template <typename T1, typename T2, typename T3> T1 sum(T2 a, T3 b) {re ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断
1. 模板实参推断( template argument deduction) 在模板实参推断过程中, 编译器使用函数调用中的实参类型来寻找模板实参, 用这些模板实参生成的函数版本与给定的函数调用最为 ...
- 模板进阶——模板实参推断
一.关键点 模板实参:模板参数T的实例类型,如int.string等 模板实参推断:从函数实参来确定模板实参的过程 模板类型参数与类型转换:const的转换.数组/函数到指针的转换 显式模板实参:当模 ...
- C++ 函数模板和排序的函数模板——学习笔记
我们在使用重载函数时,只是使用了函数名,而函数体还是得分别定义,在C++中函数模板为我们很好的解决了这个问题. 1.函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用
template < typename T> void f (T &p) 函数参数p是一个模板类型参数T的引用, 编译器会应用正常的引用绑定规则: const 是底层的, 不是顶层 ...
- 【第十六章】模板实参推断
二.模板显式推断 在C++中,若函数模板返回类型需要用户指定,那么在定义函数模板时,模板参数的顺序是很重要的,如下代码: template <typename T1, typename T2, ...
- C++ TGP 模板基础知识--01函数模板
基本范例 模板的定义是以template关键字开头 类型模板参数T前面用typename来修饰,所以遇到typename就知道其后面跟的是一个类型,typename可以用class取代 类型模板参数T ...
- c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)
什么叫泛型编程?1. 参数类型化. 2. 模板 模板概念 c++提供了函数模板,所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就成为函数模 ...
- 模板的概念以及函数模板
1.模板的概念 模板就是建立通用的模具,其中函数模板可以传进不同类型的实参,大大提高函数的复用性 特点:模板不可以直接使用,要先进行声明,它只是一个通用框架 模板并不是万能的 2.函数模板 c++的一 ...
最新文章
- 关于学习Python的一点学习总结(13->浅复制和深复制)
- 15.文件系统——软RAID的实现(二)(mdadm,watch, RAID1)
- count(*)效率提高_想使用多线程来提高处理速度,却还不知道使用CountDownLatch与CyclicBarries?...
- 分子模拟软件amber_容天AMBER优化的GPU解决方案
- 作者:刘新海(1976-),男,中国人民银行征信中心副研究员
- python直角三角形型编程_python打印直角三角形与等腰三角形实例代码
- python+opencv中imread函数第二个参数的含义
- python高维数据的读取_索引访问高维数组_Python数据分析与科学计算基础篇1:NumPy图解,使抽象的数据具象为可触摸的图形_深度学习视频-51CTO学院...
- 坑爹系列:sizeof运算符
- 设计模式-命令模式(Command)
- unity打开excel表格_Unity3D读取之(二)——读取Excel文件内容
- Kibana:在 Kibana 中对数据进行深入分析 (drilldown)
- python求自定义函数的导数
- Java SE《基础篇》——(二)程序基础01
- button加下划线
- 推荐这3款图片流动特效神器,一键即可让照片“动”起来
- 百度ORC识别身份证,JXL导出信息到excel流水作业。
- iOS字体大小适配的几种方法
- 郑州大学现代远程教育《商务礼仪》课程考核作业要求院校通智慧校园
- 我的世界paperclip_使用PaperClip在Rails中上传文件
热门文章
- 《HelloGitHub》第 20 期
- pip命令提示unknown or unsupported command 'install'——python3.7安装PyInstaller经验
- 使用Flink的Savepoint功能
- POJ-2524-Ubiquitous Religions
- Windows环境下在IDEA编辑器中spark开发安装步骤
- Session分布式共享 = Session + Redis + Nginx
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
- 用户表单事件(focus事件)
- [原]Failed to load SELinux policy. System Freezing ----redhat7or CentOS7 bug
- mysql主从复制replication的一些相关命令