C++ Templates (1.2 模板实参推断 Template Argument Deduction)
1.2 模板实参推断 Template Argument Deduction
当调用函数模板(如max()
)时,模板参数由传入的实参决定。如果传递两个int给参数类型T,C++编译器推断出T的类型为int。
然而,T可能是类型的一部分。比如说,如果声明max()
使用常量引用(const reference):
template <typename T>
T max(T const& a, T const& b)
{
return b < a ? a : b;
}
并且传递int类型的参数,T同样被推断为int类型,因为函数参数与int const&
完全匹配。
类型推断时类型转换
在类型推断中,自动类型转换受到限制:
当声明调用参数(call parameter)为引用类型,甚至一般的转换也不能用于类型推断。两个声明为同一个模板参数(template parameter)T类型的实参必须严格匹配。(Two arguments declared with the same template parameter T must match exactly)。
当声明调用参数为值类型,只有退化(decay)的普通转换才被支持。const或者volatile等限制将被忽略,引用类型转化为被引用的类型,原始数组(raw array)或者函数被转化为对应的指针类型。两个被声明为同一个模板参数T类型的实参,其退化类型必须匹配。
比如:
template <typename T>
T max(T a, T b);
...
int i = 17;
int const c = 42;
max(i, c); //OK: T 被推断为int
max(c, c); //OK: T 被推断为int
int& ir = ;
max(i, ir); //OK: T被推断为int
int arr[4];
max(&i, arr); //OK: T被推断为int*
然而,以下调用将引发错误:
max(4, 7.2); //Error:T 可能被推断为int或者double
std::string s;
max("hello", s); //Error: T 可能被推断为char const[6]或者std::string
有三种方法来处理此类错误:
- 转换实参使得两个参数得以匹配:
max(static_cast<double>(4), 7.2);
- 显式指定或者限制T的类型来防止编译器进行类型推断:
max<double>(4, 7.2);
- 将两个参数指定为不同的类型。
第1.3节将围绕该方案,第7.2节和第15章将详细讨论类型推断过程中的类型转换规则。
默认实参的类型类型推断 Type Deduction for Default Arguments
默认调用实参(default call arguments)不能用于类型推断,比如:
template <typename T>
void f(T = "");
...
f(1); //OK: T推断为int,因此它将调用f<int>(1)
f(); //Error: 无法推断T类型
为了支持这一情形,必须声明默认模板实参(default argument for the template parameter),这将在1.4节中讨论:
template <typename T = std::string>
void f(T = "");
...
f(); //OK
C++ Templates (1.2 模板实参推断 Template Argument Deduction)的更多相关文章
- C++ Templates (1.4 默认模板实参 Default Template Arguments)
返回完整目录 目录 1.4 默认模板实参 Default Template Arguments 1.4 默认模板实参 Default Template Arguments 可以为模板参数定义默认值,这 ...
- 【C++ Primer 第16章】2. 模板实参推断
模板实参推断:对于函数模板,编译器利用调用中的函数实参来确定模板参数,从函数实参来确定模板参数的过程被称为模板实参推断. 类型转换与模板类型参数 与往常一样,顶层const无论在形参中还是在是实参中, ...
- C++学习笔记(4)----模板实参推断
1. 如图所示代码,模板函数 compare(const T&, const T&) 要求两个参数类型要一样. compare("bye","dad&qu ...
- C++ Templates(1.3 多模板参数 Multiple Template Parameters)
返回完整目录 目录 1.3 多模板参数 Multiple Template Parameters 1.3.1 为返回类型设置模板参数参数 Template Parameters for Return ...
- [Effective Modern C++] Item 1. Understand template type deduction - 了解模板类型推断
条款一 了解模板类型推断 基本情况 首先定义函数模板和函数调用的形式如下,在编译期间,编译器推断T和ParamType的类型,两者基本不相同,因为ParamType常常包含const.引用等修饰符 t ...
- 现代C++之理解模板类型推断(template type deduction)
理解模板类型推断(template type deduction) 我们往往不能理解一个复杂的系统是如何运作的,但是却知道这个系统能够做什么.C++的模板类型推断便是如此,把参数传递到模板函数往往能让 ...
- C++ template —— 实例化和模板实参演绎(四)
本篇讲解实例化和模板实参演绎-------------------------------------------------------------------------------------- ...
- ES - Index Templates 全局index模板
1.Index Templates 之前我们聊过Dynamic template,它作用范围是特定的Index,如果我们想针对全局Index进行设置该如何操作呢? Index Templates 可以 ...
- C++中decltype(*)作为模板实参时的隐藏问题
在函数模板中使用智能指针时,可能会希望根据指针的类型推导出指针引用的对象类型作为模板参数,于是写出以下代码: shared_ptr<decltype(*objPtr)>(objPtr); ...
随机推荐
- Java基础单词总结
单词总结 Actualpayment --- 实际付款 Aggregatemount --- 合计金额 MemberPoints --- 会员积分 Management --- 管理 ...
- 第三章 Java面向对象(下)
3.1.抽象类 概述:在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了 格式:public abstract class 类名 {} 语法特点: 抽象类和抽象方法必须使 ...
- TCP-三次握手和四次挥手简单理解
TCP-三次握手和四次挥手简单理解 背景:TCP,即传输控制协议,是一种面向连接的可靠的,基于字节流的传输层协议.作用是在不可靠的互联网络上提供一个可靠的端到端的字节流服务,为了准确无误的将数据送达目 ...
- PythonFile对象的属性
PythonFile对象的属性: 一个文件被打开后,使用对象进行接收,接收的对象即为 File 对象 示例: ''' file.closed 返回true如果文件已被关闭,否则返回false file ...
- TCP 服务器端
""" 建立tcp服务器 绑定本地服务器信息(ip地址,端口号) 进行监听 获取监听数据(监听到的客户端和地址) 使用监听到的客户端client_socket获取数据 输 ...
- HTML5 Canvas小游戏基础:用户交互
交互是游戏的根本.缺少了用户交互,游戏就不能称之为游戏,只能说是动画或电影.事件是浏览器响应用户交互操作的一种机制. 1.事件和事件执行 事件定义了用户与页面交互时产生的各种操作(主要通过鼠标或热键的 ...
- PHP acos() 函数
实例 返回不同数的反余弦: <?phpecho(acos(0.64) . "<br>");echo(acos(-0.4) . "<br>&q ...
- Redis分布式限流器
以下文章来源于微信公众号:程序员内点事 ,作者:程序员内点事 请大家关注原作者 1. 什么是限流?为什么要限流? 限流是保证系统高可用的重要手段!!!由于互联网公司的流量巨大,系统上线会做一个流量峰值 ...
- Core下简易WebApi
代码很粗糙~ 粘贴github地址 https://github.com/htrlq/MiniAspNetCoreMini demo public class Startup { public Sta ...
- 【转载】requests库的7个主要方法、13个关键字参数以及响应对象的5种属性
Python爬虫常用模块:requests库的7个主要方法.13个关键字参数以及响应对象的5种属性 原文链接: https://zhuanlan.zhihu.com/p/67489739