模板进阶——模板实参推断
一、关键点
模板实参:模板参数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
模板进阶——模板实参推断相关推荐
- C++编程进阶7(何时使用成员函数模板,模板类的实参推断与类型转换、继承与数组)
二十六.何时使用成员函数模板 关于成员函数模板见https://blog.csdn.net/Master_Cui/article/details/111824152 成员函数模板主要用来兼容不同类型的 ...
- C++知识点62——模板实参推断与函数模板的特化
一.函数指针与模板实参推断 可以用函数模板初始化一个函数指针或给一个函数指针赋值 示例 template <typename T> int comp(const T &a, con ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用
template < typename T> void f (T &p) 函数参数p是一个模板类型参数T的引用, 编译器会应用正常的引用绑定规则: const 是底层的, 不是顶层 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断
1. 模板实参推断( template argument deduction) 在模板实参推断过程中, 编译器使用函数调用中的实参类型来寻找模板实参, 用这些模板实参生成的函数版本与给定的函数调用最为 ...
- 002 模板实参推断、重载与模板
模板实参推断 一.模板函数显示实参 情况1: template <typename T1, typename T2, typename T3> T1 sum(T2 a, T3 b) {re ...
- 【第十六章】模板实参推断
二.模板显式推断 在C++中,若函数模板返回类型需要用户指定,那么在定义函数模板时,模板参数的顺序是很重要的,如下代码: template <typename T1, typename T2, ...
- 学习笔记: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 ...
- C++ 泛型模板进阶
目录 非类型模板参数 模板特化 全特化 函数模板特化 类模板特化 偏特化 模板的分离编译 非类型模板参数 我们平时使用的模板都是和类型有关的,但是也有不是类型也能当做模板来使用,而是在tmplate& ...
- C++:19---重载与模板、模板特例化
一.重载与模板 函数模板可以被另一个模板或一个普通非模板函数重载 如果涉及函数模板,则函数匹配规则会有以下的约束: 如果同样好的函数中只有一个是非模板函数,则选择此函数 如果同样好的函数中没有非模板函 ...
最新文章
- mysql5.7多实例安装_MySQL数据库5.7多实例安装
- 【iMX6ULL核心板】一款高性能低功耗的IMX6ULL核心板 | 触觉智能NXP IMX6ULL核心板
- Boost:计时系的测试
- c语言ascii码表_新手小白整理C语言笔记备忘,带你十分钟理解C语言
- 公司注册资金100万欠债1千万,股东还100万,剩下的900万怎么办?
- 算法:老鼠走迷宫问题
- [vue] v-on可以绑定多个方法吗?
- ## CSP 201609-2 火车购票购买,C语言版(90分版)
- 集成产品开发(IPD)初探
- mysql之前缀索引
- 逻辑斯蒂回归 matlab实现
- lego ev3 c语言编程,乐高 EV3 高级编程 – 第一课:安装
- html5 保存页面为pdf,如何在PyQt5中将HTML页面保存为PDF
- 【NLP】(task8)Transformers完成抽取式问答+多选问答任务(更新ing)
- SysML实例——盖浇饭
- SAP PS常用事务代码T-CODE
- 热修复 原理与实现详解
- Laya Air+Unity3D双引擎带你做个天空球3D小游戏(下篇)
- 【学习笔记之程序员】笔记
- 用户行为分析(如何用数据驱动增长)-读书笔记1
热门文章
- 在网络中配置思科交换机
- 车牌识别与计算机编程,基于MATLAB的车牌识别程序详解.ppt
- java 基础实战_Java基础实战(三)
- c 语言读取注册表信息,C++读取注册表的实现方法
- leetcode验证冒泡排序效率
- Redis运维和开发学习笔记(3)redis搭建集群
- linux操作系统信号捕捉函数之回调函数小结
- git 初步使用01
- 框架controller找不到_SpingBoot框架知识详解
- 网络基础 2-1(应用层,HTTP三点注意,HTTP协议格式, 最简单的HTTP服务器)