在C++泛型編程中,經(jīng)常會(huì)使用到模板,但是模板在使用時(shí),可能會(huì)出現(xiàn)不知道應(yīng)該聲明是什么類型的狀況
template<typename T1,typename t2>
void fun(T1 a,T2 b)
{
?type? aplusb=a+b;
}
在上敘情況中,我們事先并不知道aplusb的類型,無法對(duì)其進(jìn)行聲明。
但是C++11中新增加的關(guān)鍵字decltype解決了這個(gè)問題
int x;
decltype(x) y;
這使得y的類型與x相同,decltype可以是表達(dá)式,函數(shù)調(diào)用等等
例如
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所以無法對(duì)返回類型設(shè)置為decltype(a,b)
這時(shí)候在C++11中提供了一個(gè)解決方案,就是后置返回類型
template<typename T1,typename t2>
auto fun(T1 a,T2 b) -> decltype(a+b)
{
return a+b;
}
這個(gè)函數(shù)模板的返回類型即為decltype(a+b)
這在實(shí)際的泛型編程中非常有用,如果一開始未知要返回什么類型,先設(shè)置返回類型為auto再在后面->type(expression),這就可以解決很大一部分的問題。
文章摘取自C++PrimerPlus第六版 8.5.6
P.S 最近在討論項(xiàng)目和看namespace的事,就拿了第八章的這個(gè)decltype關(guān)鍵字來寫,decltype算是最近學(xué)的東西里面和實(shí)際代碼中關(guān)系比較大的東西了吧。