在C++泛型编程中,经常会使用到模板,但是模板在使用时,可能会出现不知道应该声明是什么类型的状况
template<typename T1,typename t2>
void fun(T1 a,T2 b)
{
?type? aplusb=a+b;
}
在上叙情况中,我们事先并不知道aplusb的类型,无法对其进行声明。
但是C++11中新增加的关键字decltype解决了这个问题
int x;
decltype(x) y;
这使得y的类型与x相同,decltype可以是表达式,函数调用等等
例如
int fun1(a){return a;}
decltype (fun1) x;//令x类型与fun1的返回类型相同
------------------------------------
int x;
double y;
decltype(x+y) xpy;//令xpy类型与x+y相同
C++后置返回类型
template<typename T1,typename t2>
?type? fun(T1 a,T2 b)
{
return a+b;
}
由于在提供返回类型之前,还未声明变量a,b所以无法对返回类型设置为decltype(a,b)
这时候在C++11中提供了一个解决方案,就是后置返回类型
template<typename T1,typename t2>
auto fun(T1 a,T2 b) -> decltype(a+b)
{
return a+b;
}
这个函数模板的返回类型即为decltype(a+b)
这在实际的泛型编程中非常有用,如果一开始未知要返回什么类型,先设置返回类型为auto再在后面->type(expression),这就可以解决很大一部分的问题。
文章摘取自C++PrimerPlus第六版 8.5.6
P.S 最近在讨论项目和看namespace的事,就拿了第八章的这个decltype关键字来写,decltype算是最近学的东西里面和实际代码中关系比较大的东西了吧。