一、关键点

模板实参:模板参数T的实例类型,如int、string等

模板实参推断:从函数实参来确定模板实参的过程

模板类型参数与类型转换:const的转换、数组/函数到指针的转换

显式模板实参:当模板参数类型并未出现在函数参数列表时

通过函数指针推断模板实参:函数指针的类型决定了模板实参的类型

二、模板类型参数可以运用的类型转换

template <typename T> void func1(T, T);
template <typename T> void func2(const T&, const T&); int main()
{   string s1 = "hello";const string s2 = "aloha";func1(s1, s2);      //s2的顶层const将被忽略,调用func1(string, string) func2(s1, s2);      //将s1转换为const是允许的,调用func2(const string&, const string&) int a[5], b[10];func1(a, b);     //调用func1(int*, int*)func2(a, b);       //错误:形参是引用,数组不会转换为指针
}

小结:顶层const无论是在形参中还是在实参中,都会被忽略

小结:允许将一个非const对象的引用(或指针)传递给一个const对象的引用或指针

小结:如果函数参数不是引用类型,则可以对数组或函数类型的实参应用正常的指针转换

注:函数参数列表中的正常类型的类型转换不受模板影响

三、函数模板显式实参

1. 编译器无法推断出模板实参的情况:

template <typename T1, typename T2, typename T3>
T1 sum(T2, T3);     //T1的类型无法判断auto ans = sum<long>(2, 3.14);    //T1显式指定为long

注:显示模板实参按由左至右的顺序与对应的模板参数匹配

注:只有右边的显式模板参数可以省略(如T2、T3,它们可以从函数参数推断出来)

2. 正常类型转换可以应用于显式指定的实参

template <typename T>
bool cmp(const T&, const T&); int main()
{   long a;compare(a, 1024);        //错误compare<int>(a, 1024);    //a被转换为intcompare<long>(a, 1024); //1024被转换为long
}

转载于:https://www.cnblogs.com/xzxl/p/7856629.html

模板进阶——模板实参推断相关推荐

  1. C++编程进阶7(何时使用成员函数模板,模板类的实参推断与类型转换、继承与数组)

    二十六.何时使用成员函数模板 关于成员函数模板见https://blog.csdn.net/Master_Cui/article/details/111824152 成员函数模板主要用来兼容不同类型的 ...

  2. C++知识点62——模板实参推断与函数模板的特化

    一.函数指针与模板实参推断 可以用函数模板初始化一个函数指针或给一个函数指针赋值 示例 template <typename T> int comp(const T &a, con ...

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

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

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

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

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

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

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

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

  7. 学习笔记:C++初阶【C++入门、类和对象、C/C++内存管理、模板初阶、STL简介、string、vector、list、stack、queueu、模板进阶、C++的IO流】

    文章目录 前言 一.C++入门 1. C++关键字 2.命名空间 2.1 C语言缺点之一,没办法很好地解决命名冲突问题 2.2 C++提出了一个新语法--命名空间 2.2.1 命名空间概念 2.2.2 ...

  8. C++ 泛型模板进阶

    目录 非类型模板参数 模板特化 全特化 函数模板特化 类模板特化 偏特化 模板的分离编译 非类型模板参数 我们平时使用的模板都是和类型有关的,但是也有不是类型也能当做模板来使用,而是在tmplate& ...

  9. C++:19---重载与模板、模板特例化

    一.重载与模板 函数模板可以被另一个模板或一个普通非模板函数重载 如果涉及函数模板,则函数匹配规则会有以下的约束: 如果同样好的函数中只有一个是非模板函数,则选择此函数 如果同样好的函数中没有非模板函 ...

最新文章

  1. mysql5.7多实例安装_MySQL数据库5.7多实例安装
  2. 【iMX6ULL核心板】一款高性能低功耗的IMX6ULL核心板 | 触觉智能NXP IMX6ULL核心板
  3. Boost:计时系的测试
  4. c语言ascii码表_新手小白整理C语言笔记备忘,带你十分钟理解C语言
  5. 公司注册资金100万欠债1千万,股东还100万,剩下的900万怎么办?
  6. 算法:老鼠走迷宫问题
  7. [vue] v-on可以绑定多个方法吗?
  8. ## CSP 201609-2 火车购票购买,C语言版(90分版)
  9. 集成产品开发(IPD)初探
  10. mysql之前缀索引
  11. 逻辑斯蒂回归 matlab实现
  12. lego ev3 c语言编程,乐高 EV3 高级编程 – 第一课:安装
  13. html5 保存页面为pdf,如何在PyQt5中将HTML页面保存为PDF
  14. 【NLP】(task8)Transformers完成抽取式问答+多选问答任务(更新ing)
  15. SysML实例——盖浇饭
  16. SAP PS常用事务代码T-CODE
  17. 热修复 原理与实现详解
  18. Laya Air+Unity3D双引擎带你做个天空球3D小游戏(下篇)
  19. 【学习笔记之程序员】笔记
  20. 用户行为分析(如何用数据驱动增长)-读书笔记1

热门文章

  1. 在网络中配置思科交换机
  2. 车牌识别与计算机编程,基于MATLAB的车牌识别程序详解.ppt
  3. java 基础实战_Java基础实战(三)
  4. c 语言读取注册表信息,C++读取注册表的实现方法
  5. leetcode验证冒泡排序效率
  6. Redis运维和开发学习笔记(3)redis搭建集群
  7. linux操作系统信号捕捉函数之回调函数小结
  8. git 初步使用01
  9. 框架controller找不到_SpingBoot框架知识详解
  10. 网络基础 2-1(应用层,HTTP三点注意,HTTP协议格式, 最简单的HTTP服务器)