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

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

Barbara Streisand
Barbara Streisandasal
2024-12-01 08:55:11313semak imbas

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

Mengelakkan Penukaran Tersirat dalam Fungsi Bukan Membina

Perumusan Masalah:

Dalam C , fungsi tidak membina secara tersirat boleh menghantar parameter untuk memadankan jenis yang diisytiharkan. Tingkah laku ini, walaupun mudah dalam sesetengah kes, boleh membawa kepada hasil yang tidak dijangka atau ralat kompilasi apabila cuba mengehadkan parameter fungsi kepada jenis tertentu.

Penyelesaian:

Untuk mengelakkan tersirat penukaran dan memastikan bahawa fungsi bukan membina hanya menerima parameter jenis tertentu, teknik berikut boleh bekerja:

1. Lebihan Fungsi dengan Pemadaman Templat (C 11 dan Kemudian):

Tentukan lebihan fungsi dengan jenis templat tertentu yang sepadan dengan jenis hujah yang diingini. Kemudian, isytiharkan templat fungsi lain yang dipadamkan untuk semua jenis lain. Ini dengan berkesan melumpuhkan penukaran tersirat untuk fungsi itu:

void function(int);

// Delete overload for all other types
template<class T>
void function(T) = delete;

2. Pemadaman Lebihan Fungsi Berasaskan Kelas (Pra-C 11):

Pendekatan lama untuk menghalang penukaran tersirat melibatkan penciptaan kelas dengan pembina peribadi yang mengambil penunjuk tidak sah. Menggerakkan kelas ini dengan hujah templat yang sesuai akan memadamkan semua lebihan tidak sepadan:

class DeleteOverload
{
private:
    DeleteOverload(void*);
};

template<class T>
void function(T a, DeleteOverload = 0);

void function(int a)
{}

3. Penegasan Statik (C 23 dan Kemudian):

C 23 memperkenalkan keupayaan untuk menggunakan penegasan statik untuk mengesahkan bahawa fungsi dipanggil dengan jenis yang betul. Pendekatan ini memberikan mesej ralat yang lebih jelas dan bermaklumat berbanding kaedah sebelumnya:

void function(int) {}

template<class T>
void function(T) {
    // Static assertion fails when called with non-matching types
    static_assert(false, "function shall be called for int only");
}

Dengan menggunakan mana-mana teknik ini, adalah mungkin untuk menyekat fungsi bukan membina untuk menerima parameter jenis tertentu dan mengelakkan penukaran tersirat daripada berlaku.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Penukaran 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