一、函数指针与模板实参推断

可以用函数模板初始化一个函数指针或给一个函数指针赋值

示例

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——模板实参推断与函数模板的特化相关推荐

  1. 002 模板实参推断、重载与模板

    模板实参推断 一.模板函数显示实参 情况1: template <typename T1, typename T2, typename T3> T1 sum(T2 a, T3 b) {re ...

  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断

    1. 模板实参推断( template argument deduction) 在模板实参推断过程中, 编译器使用函数调用中的实参类型来寻找模板实参, 用这些模板实参生成的函数版本与给定的函数调用最为 ...

  3. 模板进阶——模板实参推断

    一.关键点 模板实参:模板参数T的实例类型,如int.string等 模板实参推断:从函数实参来确定模板实参的过程 模板类型参数与类型转换:const的转换.数组/函数到指针的转换 显式模板实参:当模 ...

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

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

  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用

    template < typename T> void f (T &p) 函数参数p是一个模板类型参数T的引用, 编译器会应用正常的引用绑定规则: const 是底层的, 不是顶层 ...

  6. 【第十六章】模板实参推断

    二.模板显式推断 在C++中,若函数模板返回类型需要用户指定,那么在定义函数模板时,模板参数的顺序是很重要的,如下代码: template <typename T1, typename T2, ...

  7. C++ TGP 模板基础知识--01函数模板

    基本范例 模板的定义是以template关键字开头 类型模板参数T前面用typename来修饰,所以遇到typename就知道其后面跟的是一个类型,typename可以用class取代 类型模板参数T ...

  8. c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)

    什么叫泛型编程?1. 参数类型化. 2. 模板 模板概念 c++提供了函数模板,所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就成为函数模 ...

  9. 模板的概念以及函数模板

    1.模板的概念 模板就是建立通用的模具,其中函数模板可以传进不同类型的实参,大大提高函数的复用性 特点:模板不可以直接使用,要先进行声明,它只是一个通用框架 模板并不是万能的 2.函数模板 c++的一 ...

最新文章

  1. 关于学习Python的一点学习总结(13->浅复制和深复制)
  2. 15.文件系统——软RAID的实现(二)(mdadm,watch, RAID1)
  3. count(*)效率提高_想使用多线程来提高处理速度,却还不知道使用CountDownLatch与CyclicBarries?...
  4. 分子模拟软件amber_容天AMBER优化的GPU解决方案
  5. 作者:刘新海(1976-),男,中国人民银行征信中心副研究员
  6. python直角三角形型编程_python打印直角三角形与等腰三角形实例代码
  7. python+opencv中imread函数第二个参数的含义
  8. python高维数据的读取_索引访问高维数组_Python数据分析与科学计算基础篇1:NumPy图解,使抽象的数据具象为可触摸的图形_深度学习视频-51CTO学院...
  9. 坑爹系列:sizeof运算符
  10. 设计模式-命令模式(Command)
  11. unity打开excel表格_Unity3D读取之(二)——读取Excel文件内容
  12. Kibana:在 Kibana 中对数据进行深入分析 (drilldown)
  13. python求自定义函数的导数
  14. Java SE《基础篇》——(二)程序基础01
  15. button加下划线
  16. 推荐这3款图片流动特效神器,一键即可让照片“动”起来
  17. 百度ORC识别身份证,JXL导出信息到excel流水作业。
  18. iOS字体大小适配的几种方法
  19. 郑州大学现代远程教育《商务礼仪》课程考核作业要求院校通智慧校园
  20. 我的世界paperclip_使用PaperClip在Rails中上传文件

热门文章

  1. 《HelloGitHub》第 20 期
  2. pip命令提示unknown or unsupported command 'install'——python3.7安装PyInstaller经验
  3. 使用Flink的Savepoint功能
  4. POJ-2524-Ubiquitous Religions
  5. Windows环境下在IDEA编辑器中spark开发安装步骤
  6. Session分布式共享 = Session + Redis + Nginx
  7. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
  8. 用户表单事件(focus事件)
  9. [原]Failed to load SELinux policy. System Freezing ----redhat7or CentOS7 bug
  10. mysql主从复制replication的一些相关命令