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
Lepaskan: 2024-12-01 08:55:11
asal
358 orang telah melayarinya

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;
Salin selepas log masuk

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)
{}
Salin selepas log masuk

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");
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan