(C++)关键字tycltype(例子讲解)

直接举例子说吧,现在有这么一个模板:


template <class T1, class T2>
void ft (T1 &x, T2 &y)
{
    ...
    ?type? xpy = x+;
    ...    
}

这里我们不知道xpy的类型,不知道ft后面如何使用,就很难搞。

于是就有了C++11的关键字decltype。

使用方法(例子)
int x;
decltype(x) y;//就是让x和y是同一个类型。

如果参数是表达式的话:
decltype(x+y) xpy;
xpy = x+y;

通用格式:
decltype (expression) var;
decltype比这些实例要复杂些。为了确定类型,编译器必须遍历一个核对表。

简化版核对表:
1、如果expression是一个没有用括号括起的标识符,则var的类型与该标识符类型相同,包括const等限定符。
2、如果expression是一个函数调用,则var的类型与函数的返回类型相同:

long indeed(int)
decltype (indeed(3)) m;
注意这里并不会实际调用函数。编译器通过查看函数的原型来获悉返回类型,而无需实际调用函数。
3、如果expression是一个左值,则var为指向其类型的引用。最常见的情况就是expression是用括号括起来的标识符。
eg:
double xx = 4.4;
decltype((xx)) r2 = xx ; // r2 is double &
decltype(xx) w = xx; // w is double

4、如果前面都不满足,则var的类型与expression类型相同。
eg:
int j = 3;
int &k  = j;
int  &n = j;
decltype (j+6)i1; // i1 type int
decltype (100L) i2; // i2 type long
decltype (k+n) i3; // i3 type int

注意:虽然k和n都是引用,是表达式k+n不是引用。
如果需要多次声明,可以结合使用typdef和decltype。

其中还有decltype本身无法解决的问题。
举个例子模板:
template <class T1, class T2>
?type? gt(T1 x, T2 y)
{
    return x+y;    
}

这里我们还是无法知道x和y相加得到的类型。我们可以将返回类型设置为decltype(x + y),但是这里没有声明参数x和y,因为它们不在作用域内。

因此我们可以这样:
原型:double h(int x, float y);
改成:auto h(int x, float y) -> double;
这将返回类型移到了参数声明后面。->double被称为后置返回类型。 其中auto是一个占位符,表示后置返回类型提供的类型。这是c++11的新增auto语法。这个语法也可以用于函数定义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄TimTim仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值