首頁 >後端開發 >C++ >`std::enable_if` 如何運作:揭開其實現和使用的神秘面紗?

`std::enable_if` 如何運作:揭開其實現和使用的神秘面紗?

Barbara Streisand
Barbara Streisand原創
2024-11-05 07:52:02749瀏覽

How Does `std::enable_if` Work: Unraveling the Mysteries of Its Implementation and Usage?

理解std::enable_if:破解其目的和實現

雖然std::enable_if 的本質是在某些上下文中掌握的,但它的錯綜複雜的問題,特別是模板語句中的第二個參數和對std::enable_if 的賦值,仍然存在神秘的。深入研究其工作原理將解開這些謎團。

std::enable_if 的要點

std::enable_if 是專門的模板,定義如下:

<code class="cpp">template<bool Cond, class T = void> struct enable_if {};
template<class T> struct enable_if<true, T> { typedef T type; };</code>

至關重要的是,型別別名typedef T 型別只在Cond 為true.

揭示用法

考慮以下聲明:

<code class="cpp">template<typename T>
typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }</code>

這裡,foo 的傳回型別由std: 定義: enable_if<:numeric_limits>::is_integer,無效>::型別。由於 std::numeric_limits::is_integer 是一個布林條件,因此僅當條件為 true 時才會定義此傳回類型。

澄清第二個參數

符號中:

<code class="cpp">template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(const T& bar) { isInt(); }</code>

= 0 用於預設第二個模板參數。這允許使用 foo(1) 呼叫兩個選項,而不是在 std::enable_if 參數未預設時需要兩個範本參數。

值得注意的細節

  • 明確輸入類型名稱 std::enable_if<:condition t>::type 增強了清晰度。
  • 在 C 14 中,enable_if_t 是已建立的類型,應該用於傳回類型,將其簡化為 std::enable_if_t
  • 對於2013年之前的Visual Studio版本,只有回傳型別可以使用enable_if。

以上是`std::enable_if` 如何運作:揭開其實現和使用的神秘面紗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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