欢迎选择我的课程,让我们一起见证您的进步~~
C++的模板一般是用於泛型(也就是一份程式碼給多種型別共用),但是也可以用於非型別(Non-type template parameter),可以是整數型、字元、布林這些可以透過字面量明確判定等價的類型。
你平常宣告一個型別模板參數可能是 template <typename T>,而這裡Non-type模板參數是 template <bool B>,就這點區別而已。如果要詳細說enable_if這個模板技法,關鍵不是在Non-type,也不是在partial spec,而是在於SFINAE,你學習一下這方面的內容。
template <typename T>
template <bool B>
enable_if
enable_if上面寫著templatebool _test>,所以自然要填true/false進去。
在使用的時候,你會發現如果一個表達式expr的結果為true,那麼enable_if::type就是存在的。所以你就可以寫這樣的程式碼:
template<typename T> __forceinline T Copy(typename enable_if<sizeof(T)>=4, T>::type const& t) { return t; }
來測試一個型別是否不小於4個位元組。如果是原樣返回,如果不是就編譯錯誤。
C++的模板一般是用於泛型(也就是一份程式碼給多種型別共用),但是也可以用於非型別(Non-type template parameter),可以是整數型、字元、布林這些可以透過字面量明確判定等價的類型。
你平常宣告一個型別模板參數可能是
template <typename T>
,而這裡Non-type模板參數是template <bool B>
,就這點區別而已。如果要詳細說enable_if
這個模板技法,關鍵不是在Non-type,也不是在partial spec,而是在於SFINAE,你學習一下這方面的內容。enable_if上面寫著templatebool _test>,所以自然要填true/false進去。
在使用的時候,你會發現如果一個表達式expr的結果為true,那麼enable_if::type就是存在的。所以你就可以寫這樣的程式碼:
來測試一個型別是否不小於4個位元組。如果是原樣返回,如果不是就編譯錯誤。