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
的型別來呼叫。然而,第二個實作在傳回中使用帶有 std::enable_if 的 SFINAE模板函數的類型。在這種情況下,可以使用任何類型呼叫函數 foo,但僅當 T 滿足條件 std::is_integral
在您的範例中,第一個實作無法編譯,因為在確定第一個範本參數的範本是否已實例化時,沒有考慮第二個範本參數的預設範本參數。因此,編譯器假設您嘗試兩次重新聲明相同的函數模板,從而導致錯誤。
另一方面,第二個實作可以工作,因為表達式類型名稱std::enable_if<:is_integral t>::value>::type 在範本實例化期間計算並用作函數的回傳類型。由於此表達式是模板函數簽名的一部分,因此它允許 SFINAE 根據 T 的值區分不同的模板專業化。
以上是SFINAE 套用於傳回類型與模板參數時有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!