我们知道,使用函数模板可以减少重复性无谓工作量,但是遇到下面的情况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等内置数据类型名直接填入。
如图 不允许使用类型名!