C++11 引入的 decltype
是一個容易被忽略的重要組件,在撰寫 Template 時,decltype
能起許多作用。這一篇說明 decltype
的基本用法。
傳入一個型別、值或運算式(expression)給 decltype
即可獲得該傳入的東西其型別為何。舉幾個例子:
decltype(1.0 + 1) the_double = 0.0;
上述程式碼中,the_double
的型別是 double
。在編譯時間,decltype
利用傳入的算式,推導出型別為 double
,並直接拿來定義變數。
decltype
最管用的地方大概是 function templates
,利用給定的函數參數推導出回傳型別,如下列片段:
template <typename Container, typename Index>
auto DoSomething(Container& c, Index i) -> decltype(c[i])
{
return c[i];
}
上述範例取材自《Effective Modern C++》by Scott Meyers
仔細看,上述程式碼片段沒有明確寫出回傳型別,而是利用 decltype
來明確定義適用的回傳型別。撰寫 C++ Template 程式碼時,由於型別不定,因此,
欲印出算式的型別,可利用 typeid
:
auto type_name = typeid(decltype(1.0 + 1)).name(); // "double"
C++14 進一步定義了 decltype(auto)
,可用於函數的回傳型別定義,如此一來,便可確定函數定義與實際回傳型別吻合:
template <typename Container, typename Index>
decltype(auto)
DoSomething(Container& c, Index i)
{
return c[i];
}