選擇具有不同enable_if條件的成員函數
在C語言中,enable_if是工具,用於根據是否有條件啟用或停用某些程式碼模板參數滿足特定條件。當您想要根據模板參數自訂類別或函數的行為時,這非常有用。
在給定的範例中,目標是建立一個成員函數 MyFunction,該函數根據模板是否參數T是否為整數。預期的實作是使用 MyFunction 的兩個重載,一個用於 T = int,一個用於 T != int。
實現此目的的一種方法是透過 enable_if,如下面的程式碼所示:
<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>
但是,這段程式碼會因為enable_if的錯誤使用而導致編譯錯誤。在 C 中,模板參數的替換發生在重載決策期間。在這種情況下,不會發生替換,因為 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>
此方法可確保根據T 的值選擇正確的MyFunction 版本。
以上是如何在 C 中使用enable_if 實作條件成員函數重載?的詳細內容。更多資訊請關注PHP中文網其他相關文章!