問題:
確定類別成員的版本應基於類別的模板參數呼叫函數可能具有挑戰性。使用enable_if可以是解決方案,但可能會遇到「struct std::enable_if'中沒有名為'type'的類型」之類的錯誤。
解:
問題在於範本參數的替換。 enable_if 的工作原理是消除在模板參數替換期間導致錯誤的重載。在提供的程式碼中,不會發生替換,因為在成員函數實例化時 T 已知。
要解決此問題,請建立一個預設為 T 的虛擬模板參數,並將其用於 SFINAE(替換失敗不是錯誤)。將有問題的程式碼替換為以下內容:
<code class="cpp">template<typename T> struct Point { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { std::cout << "T is int." << std::endl; } template<typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { std::cout << "T is not int." << std::endl; } };</code>
注意:
為了防止使用者明確指定範本參數並可能獲得不正確的結果,您可以加入靜態對成員函數的斷言,如以下範例所示:
<code class="cpp">template<typename T> struct Point { template<typename... Dummy, typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!"); std::cout << "T is int." << std::endl; } template<typename... Dummy, typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!"); std::cout << "T is not int." << std::endl; } };</code>
以上是如何使用enable_if根據範本參數選擇函數:為什麼會出現「struct std::enable_if」中沒有類型名稱為「type」的錯誤以及如何解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!