防止不匹配函數類型的隱式轉換
在 C 中,函數可以採用各種類型的參數。這包括使用者定義的類型,可以透過隱式轉換作為函數參數傳遞。但是,在某些情況下,可能需要防止這種隱式轉換並將函數呼叫限制為僅與聲明的函數簽章相符的參數。
為了避免非建構子的隱式轉換,可以使用明確關鍵字被使用。但是,這種方法僅適用於建構函數,不適用於非建構函數。
解決此問題的一種方法是定義一個與所有其他類型相符的函數範本。此技術對不匹配類型的模板函數進行優先排序,防止它們被傳遞到具有確切函數簽名的原始函數。
範例:
// Original function signature requires an int void function(int); // Function template matches all other types template <class T> void function(T) = delete; // C++11
這個方法確保只有在傳遞整數參數時才呼叫具有確切簽章 function(int) 的原始函式。任何其他內容,例如字元或長整型,都會觸發函數模板並導致編譯錯誤。
Pre-C 11 方法:
適用於C 之前的C 版本11、可以使用不同的技術:
// Creating a class to handle overload deletion class DeleteOverload { private: DeleteOverload(void*); }; // Function template with overload deletion template <class T> void function(T a, DeleteOverload = 0); // Original function with exact signature void function(int a) {}
在這種方法中,DeleteOverload 類別無法有效地實例化禁止將其用作模板參數。這會強制所有不匹配的類型觸發模板函數,並阻止它們到達具有確切簽名的原始函數。
C 23 版本:
C 23 引入static_assert 功能,在這種情況下可以使用它來更加清晰:
void function(int); // Chosen for ints template <class T> void function(T) { static_assert(false, "function should only be called for ints"); } int main() { function(1); // function(1l); // Error: static assertion failed }
透過使用此方法,錯誤訊息清楚地表明該函數僅用於整數,從而增強了程式碼的可讀性和理解性。
以上是如何防止 C 中不符合函數類型的隱式轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!