C++11新增模板关键字decltype

我们知道,使用函数模板可以减少重复性无谓工作量,但是遇到下面的情况C++98可能会束手无策。

template<class T1,class T2>
void fun(T1 t1,T2 t2)
{
    var = t1 + t2;
}

我们想把t1,t2的和存储在一个变量中,肯定首先必须声明var的类型,但是var的类型究竟是什么呢?
在C++98以及之前,我们没办法根据t1 t2的类型来声明var的类型,于是在全球程序员们的一致呼声下,C++11增加了decltype关键字!

使用方法

1、使用变量名

int t = 5;
decltype(x) y;

decltype(x) 表明和x一样的类型名,这样y就被声明为int型变量。

double d;
short s;
char* pc;
decltype(d) dou;//双精度浮点型
decltype(s) age;//短整型
decltype(pc) point;//字符指针类型

2、使用函数返回值

如果括号中是一个函数调用,声明类型和函数返回类型相同

double price(int n);
decltype(price(3)) my_price;//my_price类型为double

需要注意的是,上面的代码不会实际调用函数,编译器只会通过查看函数原型获取函数返回值类型,为my_price声明。

3、使用常量

double i = 5.9;
decltype(i+1.1) x;//x是double类型
decltype(599999L) l;//l是long类型

在这里插入图片描述

4、使用为函数返回值

请看下面的函数

template<typename T1,typename T2>
return_type sum(T1 x,T2 y) 
{
    return x+y;
}

这个模板函数是不完整的,因为这里的return_type到底应该填什么呢?
因为x和y的类型是不确定的,因此也造成了x+y类型的不确定性。看到以前的的decltype 用法,好像可以使用decltype(x+y)作为函数返回值标识,但是此时还未声明参数x和y,他们不再作用域中(编译器无法获取他们的类型),因此C++11新建了一种函数声明的语法:

template<typename T1,typename T2>
auto sum(T1 x,T2 y) -> decltype(x+y)
{
    return x+y;
}

可以写成这样,-> decltype(x+y)称为后置返回类型,这是C++为auto添上的一对翅膀。现在decltype在参数声明之后,编译器可以使用参数类型确定函数返回类型!

需要注意

decltype后括号内可接受的参数很灵活,但是唯一不行的就是不能直接将int ,double,short,char,float等内置数据类型名直接填入。
在这里插入图片描述如图 不允许使用类型名!

发布了337 篇原创文章 · 获赞 43 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/dghcs18/article/details/104176896
今日推荐