iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 9
1
Software Development

山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑系列 第 9

DAY 8:Modern C++ 要角,老語言回春的關鍵,談 auto/decltype,卷二

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];
}

上一篇
DAY 7:Modern C++ 要角,老語言回春的關鍵,談 auto/decltype,卷一
下一篇
DAY 9:Modern C++ 要角,再談 auto
系列文
山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑26

尚未有邦友留言

立即登入留言