大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
在写函数模板时,存在一个问题是不能总能知道应该在声明中使用那种类型。
例如:
template<class T1, class T2>
void ft(T1 x, T2 y)
{
...
?type? xpy = x + y;
...
}
在以上的例子中,因为函数模板的存在,我们并不能知道变量xpy的类型。
这时我们可以使用C++11新增的关键字decltype
int x;
decltype(x) y; //使得y的类型与x相同
decltype(x+y) xpy = x+y; // 参数可以是表达式 , 可直接进行初始化
—————————————————————————-
为确定类型,编译器必须遍历一个核对表,假设有如下声明:
decltype (expression) var;
第一步:
如果expression是一个没有内层括号括起来的表标识符,则var的类型与该标识符的类型相同,包括const限定符:
double x = 5.5;
double y = 7.9;
double &rx = x;
const double *pd;
decltype(x) w; // w is type double
decltype(rx) u = y; // u is type double &
decltype(pd) v; // v is type const double *
```
**第二步:**
如果expression是一个函数调用,则var的类型与函数的返回类型相同:
long indeed(int);
decltype(indeed(int)) m; // m is type long
**第三步:**
如果expression是一个**带内括号**的左值,则var为指向该类型的**引用**
double xx = 4.4;
decltype ((xx)) r2 = xx; // r2 is type double &
decltype (xx) w = xx; // w is type double
第四步:
如果前面的条件都不满足,则var的类型与expression的类型相同:
int j = 3;
int &k = j;
int &n = j;
decltype(j+6) i1; // i1 is type int
decltype(100L) i2; // i2 is type long;
decltype(k+n) i3; // i3 is type int;
虽然k和n都是引用,但是k+n不是引用,是两个int的和,类型是int。
——————————————————–
(C++11后置返回类型)
template <class T1, class T2>
?type? gt(T1 x, T2 y)
{
...
retrun x+y;
}
我们无法预先知道x+y的类型,所以我们不能确定返回值的类型。而且我们无法使用decltype,因为此时形参x与y
还未声明,所以不能使用decltype(x, y)。
此时我们可以使用如下的方法,例如有一声明:
double h(int x, float y);
使用新增的语法可以表示为:
auto h(int x, float y) -> double;
这将返回类型移到了参数声明后面。->double被称为后置返回类型。其中auto是一个占位符,表示后置返回类型提供的原型。
通过结合使用这种语法和decltype,便可以给gt()指定返回类型,如下所示:
template<class T1, class T2>
auto gt(T1 x, T2 x) -> decltype(x+y)
{
return x + y;
}
现在,declytpe在参数声明后面,因此x与y位于作用域内,可以使用它们
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195769.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...