Penghindaran Penukaran Tersirat untuk Fungsi Tidak Membina
Pertimbangkan fungsi bukan pembinaan yang menjangkakan parameter integer tetapi membenarkan hantaran tersirat daripada jenis lain seperti aksara, boolean dan longs. Untuk mengelakkan tingkah laku yang tidak diingini ini dan memastikan bahawa fungsi hanya menerima parameter jenis yang ditentukan, kami boleh menggunakan teknik berikut:
C 11 dan Kaedah Kemudian:
The pendekatan yang paling langsung adalah untuk menentukan templat fungsi yang sepadan dengan semua jenis lain:
void function(int); // this will be selected for int only template <class T> void function(T) = delete; // C++11
Ini berfungsi kerana bukan templat berfungsi dengan langsung pemadanan diutamakan.
Teknik Pra-C 11:
Sebelum C 11, penyelesaian alternatif melibatkan mewujudkan kelas pembantu untuk menguatkuasakan tingkah laku yang 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) {}
Teknik ini bergantung pada beban berlebihan berbilang fungsi dengan tandatangan yang serupa, di mana fungsi dengan jenis yang dijangkakan mengambil masa keutamaan.
C 23 Kemas Kini:
C 23 memperkenalkan cara yang lebih ringkas dan bermaklumat untuk menangani situasi ini:
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"); }
Menggunakan static_assert dalam templat fungsi memberikan mesej ralat yang jelas apabila memanggil fungsi dengan jenis parameter yang tidak dijangka.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Penukaran Tersirat dalam Fungsi Tidak Membina dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!