首頁 >後端開發 >C++ >SFINAE 套用於傳回類型與模板參數時有何不同?

SFINAE 套用於傳回類型與模板參數時有何不同?

DDD
DDD原創
2024-12-19 12:44:11855瀏覽

How Does SFINAE Differ When Applied to Return Types Versus Template Parameters?

SFINAE 在回傳類型與模板參數中的適用性

在C 程式設計中,SFINAE(替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗不是錯誤)是一種替換失敗技術模板元編程。 SFINAE 可讓您使用模板參數來指定可傳遞給模板函數或類別的參數類型的約束。

在您的範例中,您有一個名為foo 的函數的兩個實作:

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void;

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void;

第一個實作在範本參數中使用SFINAE 和std::enable_if 元函數。這表示模板函數 foo 只能使用滿足條件 std::is_integral::value.

的型別來呼叫。然而,第二個實作在傳回中使用帶有 std::enable_if 的 SFINAE模板函數的類型。在這種情況下,可以使用任何類型呼叫函數 foo,但僅當 T 滿足條件 std::is_integral::value 時,傳回類型才是 void 類型。

在您的範例中,第一個實作無法編譯,因為在確定第一個範本參數的範本是否已實例化時,沒有考慮第二個範本參數的預設範本參數。因此,編譯器假設您嘗試兩次重新聲明相同的函數模板,從而導致錯誤。

另一方面,第二個實作可以工作,因為表達式類型名稱std::enable_if<:is_integral t>::value>::type 在範本實例化期間計算並用作函數的回傳類型。由於此表達式是模板函數簽名的一部分,因此它允許 SFINAE 根據 T 的值區分不同的模板專業化。

以上是SFINAE 套用於傳回類型與模板參數時有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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