Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencegah Penukaran Jenis Tersirat dalam Fungsi C Tidak Membina?

Bagaimanakah Saya Boleh Mencegah Penukaran Jenis Tersirat dalam Fungsi C Tidak Membina?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-06 10:26:111075semak imbas

How Can I Prevent Implicit Type Conversions in Non-Constructing C   Functions?

Mengelakkan Penukaran Tersirat dalam Fungsi 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.

Menggunakan Templat Fungsi untuk Menguatkuasakan Ketakpadanan Jenis

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.

Pendekatan Pra-C 11 Menggunakan Lebihan Padam

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 Static Aserstion for Enforcement Type Constraints

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
}

Kesimpulan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn