Scott Meyers 即將出版的書EC 11 建議避免在函式簽章中使用std::enable_if 。儘管它在有條件地從重載解析中刪除函數或類別方面具有多功能性,但某些限制和可讀性問題值得重新考慮其用法。
函數參數:
<code class="cpp">template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< // Option 1: As function parameter std::is_same<U, int>::value >::type* = 0) { return 42; } };</code>
模板參數:
<code class="cpp">template<typename T> struct Check2 { template<typename U = T, typename std::enable_if< // Option 2: As template parameter std::is_same<U, int>::value, int >::type = 0> U read() { return 42; } };</code>
返回類型:
<code class="cpp">template<typename T> struct Check3 { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value, U>::type read() { // Option 3: As return type return 42; } };</code>
最佳解決方案是將enable_if放置在模板參數中
最佳解決方案是將enable_if放置在模板參數中。這種方法有幾個優點:
可讀性增強:
enable_if 的使用與返回/參數類型分開,提高了清晰度並減少了混亂。
通用適用性:
與其他選項不同,模板參數放置適用於沒有附加參數的建構子和運算子。
返回類型排除:
雖然「避免函數簽章中的std::enable_if」主要解決其在普通函數簽章中的使用,它確實適用於模板專業化中的回傳類型。這個問題源自於將enable_if與回傳類型合併時的可讀性問題。
成員函數與非成員函數:
以上是您應該在函數簽章中避免使用“std::enable_if”嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!