Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencegah Penukaran Jenis Tersirat dalam Fungsi C Tidak Membina?
Dalam kod yang disediakan, fungsi fungsi diisytiharkan untuk menerima parameter integer. Walau bagaimanapun, ia juga secara tidak sengaja menerima aksara, boolean dan rindu disebabkan penghantaran tersirat. Untuk mengelakkan tingkah laku yang tidak diingini ini, kami mencari kaedah untuk menguatkuasakan pemadanan jenis yang ketat dan melarang penukaran tersirat.
Satu pendekatan untuk mengelakkan penukaran tersirat adalah dengan menentukan templat fungsi yang sepadan dengan semua jenis kecuali jenis yang dikehendaki. Sebagai contoh, kita boleh mencipta templat untuk jenis lain dan menandainya sebagai dipadam, dengan berkesan melarang penyusunannya:
void function(int); // this will be selected for int only template<class T> void function(T) = delete; // C++11
Dengan cara ini, fungsi bukan templat dengan padanan langsung, dalam kes ini, fungsi batal (int), akan sentiasa dipilih untuk integer. Sebarang percubaan untuk memanggil fungsi dengan jenis lain akan mencetuskan ralat disebabkan templat yang dipadamkan.
Sebelum C 11, kaedah berbeza diperlukan untuk mencapai panggilan fungsi yang ketat jenis tanpa penukaran tersirat. Ini melibatkan mencipta kelas DeleteOverload dan menggunakannya untuk melumpuhkan pemilihan lebihan beban untuk jenis yang tidak diingini:
// because this ugly code will give you compilation error for all other types class DeleteOverload { private: DeleteOverload(void*); }; template<class T> void function(T a, DeleteOverload = 0); void function(int a) {}
C 23 memperkenalkan lebih mesra pengguna pendekatan menggunakan static_assert(false, msg). Ini membolehkan mesej ralat yang lebih jelas apabila jenis tidak sepadan:
void function(int) {} // this will be selected for int only template<class T> void function(T) { // since C++23 static_assert(false, "function shall be called for int only"); } int main() { function(1); // function(1l); // ^^^^^^^^^^^^ produces error: // error: static assertion failed: function shall be called for int only }
Dengan menggunakan teknik ini, kita boleh mengelakkan penukaran tersirat dalam fungsi bukan membina, memastikan pemeriksaan jenis yang lebih ketat dan menghapuskan kemungkinan ralat disebabkan oleh ketidakpadanan jenis yang tidak disengajakan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Penukaran Jenis Tersirat dalam Fungsi C Tidak Membina?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!