Mencegah Penukaran Tersirat untuk Jenis Fungsi Tidak Padanan
Dalam C , fungsi boleh mengambil parameter pelbagai jenis. Ini termasuk jenis yang ditentukan pengguna, yang boleh dihantar sebagai hujah fungsi melalui penghantaran tersirat. Walau bagaimanapun, dalam senario tertentu, adalah wajar untuk menghalang penghantaran tersirat ini dan mengehadkan panggilan fungsi kepada hanya argumen yang sepadan dengan tandatangan fungsi yang diisytiharkan.
Untuk mengelakkan penukaran tersirat bagi fungsi bukan membina, kata kunci eksplisit boleh digunakan. Walau bagaimanapun, pendekatan ini hanya berfungsi untuk membina fungsi, bukan untuk fungsi bukan membina.
Satu penyelesaian kepada masalah ini ialah untuk menentukan templat fungsi yang sepadan dengan semua jenis lain. Teknik ini mengutamakan fungsi templat untuk jenis tidak sepadan, menghalangnya daripada dihantar ke fungsi asal dengan tandatangan fungsi yang tepat.
Contoh:
// Original function signature requires an int void function(int); // Function template matches all other types template <class T> void function(T) = delete; // C++11
Pendekatan ini memastikan bahawa fungsi asal dengan fungsi tandatangan yang tepat(int) hanya digunakan apabila hujah integer diluluskan. Apa-apa sahaja, seperti aksara atau longs, mencetuskan templat fungsi dan mengakibatkan ralat penyusunan.
Kaedah Pra-C 11:
Untuk versi C sebelum C 11, teknik yang berbeza boleh digunakan:
// 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) {}
Dalam pendekatan ini, kelas DeleteOverload tidak boleh instantiated, berkesan melarang penggunaannya sebagai hujah templat. Ini memaksa semua jenis tidak sepadan untuk mencetuskan fungsi templat dan melarangnya daripada mencapai fungsi asal dengan tandatangan yang tepat.
Versi C 23:
C 23 memperkenalkan ciri static_assert, yang boleh digunakan untuk lebih jelas dalam hal ini senario:
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 }
Dengan menggunakan kaedah ini, mesej ralat dengan jelas menyampaikan bahawa fungsi itu bertujuan semata-mata untuk integer, meningkatkan kebolehbacaan dan pemahaman kod.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Penukaran Tersirat untuk Jenis Fungsi Tidak Padanan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!