在最近的一個問題中,討論了 std::enable_if 作為條件返回類型的用法。雖然第一個用法很清楚,但第二個用法(其中包括對 std::enable_if 的看似毫無意義的賦值)仍然令人費解。
解鎖概念
解開謎團,我們必須深入研究std::enable_if 的定義:
template<bool Cond, class T = void> struct enable_if {}; template<class T> struct enable_if<true, T> { typedef T type; };
關鍵在於typedef T 類型只有在bool Cond 為true 時才定義。
應用於範例
有了這個理解,我們再回顧一下程式碼:
template<typename T> typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }
這裡,std::enable_if 用來定義foo 函數的傳回類型。如果 T 是整數,則傳回類型將為 void;否則,函數將無法編譯。
預設值的作用
在第二個範例中:
template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0> void foo(const T& bar) { isInt(); }
= 0 預設參數確保這兩個選項都可以使用foo
不斷加深理解
在 C 14 中,引入了 std::enable_if_t 類型,它應該用來代替 typedef 形式。這會產生更簡潔的回傳類型:
std::enable_if_t<std::numeric_limits<T>::is_integer>
以上是為什麼 C 模板中對 std::enable_if 進行看似無意義的賦值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!