為什麼應該在函式簽章中避免 std::enable_if?
std::enable_if 是條件範本元程式設計的強大工具,但是它在函式簽章中的濫用可能會導致各種陷阱。本文探討了為什麼通常應該避免在函數簽章中使用 std::enable_if 並提供替代方法。
函數參數啟用
當用作函數參數時,std ::enable_if 可能會使函數簽章與複雜的型別名表達式變得混亂。這會降低可讀性並使程式碼更難以維護。例如:
<code class="cpp">template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } };</code>
模板參數啟用
建議的方法是將std::enable_if 放在範本參數中:
<code class="cpp">template<typename T> struct Check2 { template<typename U = T, typename std::enable_if< std::is_same<U, int>::value, int>::type = 0> U read() { return 42; } template<typename U = T, typename std::enable_if< std::is_same<U, double>::value, int>::type = 0> U read() { return 3.14; } };</code>
這種方法透過將模板參數與返回/參數類型分開來增強可讀性。它也提供了普遍適用性,因為建構函式和某些運算子不能有額外的參數或傳回類型。
回傳型別
使用 std::enable_if 作為傳回型別是不是典型函式簽章的一部份。然而,它可能會產生誤導,通常應該避免。
會員與非會員範本
本文中提到的問題同樣適用於會員與非會員-成員函數範本。
以上是為什麼應該在函數簽章中避免使用'std::enable_if”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!