使用不同的enable_if條件選擇成員函數
在C中,enable_if元函數可用於根據選擇性地啟用或停用程式碼-時間條件。這種技術通常用於提供成員函數的重載,這些函數可以處理不同類型的參數或根據範本參數執行不同的操作。
當嘗試使用enable_if根據類別模板參數在成員函數之間進行選擇時,這一點很重要了解enable_if透過替換模板參數來工作,從而導致從重載解析集中刪除錯誤。
問題:
在提供的程式碼中, enable_if 條件直接應用於成員函數,但這種方法沒有達到預期的效果,因為實例化這些函數時模板參數T 是已知的。
<code class="cpp">template<typename T> struct Point { void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T &>::type* = 0) { std::cout << "T is int." << std::endl; } void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float &>::type* = 0) { std::cout << "T is not int." << std::endl; } };</code>
解決方案:
要解決此問題,請建立一個預設為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>
防止明確模板參數特殊化:
如上所述透過HostileFork,使用者可以明確指定成員函數的範本參數,這可能會導致不正確的結果。為了防止這種情況,請使用 static_assert 檢查是否未提供明確參數:
<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>
以上是如何在C中使用enable_if根據類別模板參數選擇成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!