首頁 >後端開發 >C++ >為什麼 C 模板中對 std::enable_if 進行看似無意義的賦值?

為什麼 C 模板中對 std::enable_if 進行看似無意義的賦值?

Linda Hamilton
Linda Hamilton原創
2024-11-06 10:49:02707瀏覽

Why is there a Seemingly Meaningless Assignment to std::enable_if in C   Templates?

了解 std::enable_if 的內部工作原理

在最近的一個問題中,討論了 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(1); 呼叫。如果沒有默認,呼叫 foo 將需要兩個模板參數,而不僅僅是 int。

不斷加深理解

在 C 14 中,引入了 std::enable_if_t 類型,它應該用來代替 typedef 形式。這會產生更簡潔的回傳類型:

std::enable_if_t<std::numeric_limits<T>::is_integer>

以上是為什麼 C 模板中對 std::enable_if 進行看似無意義的賦值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn