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

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

Mary-Kate Olsen
Lepaskan: 2024-11-30 11:39:12
asal
660 orang telah melayarinya

How Can I Prevent Implicit Conversions for Non-Matching Function Types in C  ?

Mencegah Penukaran Tersirat untuk Jenis Fungsi Tidak Padanan

Dalam C , fungsi boleh mengambil parameter pelbagai jenis. Ini termasuk jenis yang ditentukan pengguna, yang boleh dihantar sebagai hujah fungsi melalui penghantaran tersirat. Walau bagaimanapun, dalam senario tertentu, adalah wajar untuk menghalang penghantaran tersirat ini dan mengehadkan panggilan fungsi kepada hanya argumen yang sepadan dengan tandatangan fungsi yang diisytiharkan.

Untuk mengelakkan penukaran tersirat bagi fungsi bukan membina, kata kunci eksplisit boleh digunakan. Walau bagaimanapun, pendekatan ini hanya berfungsi untuk membina fungsi, bukan untuk fungsi bukan membina.

Satu penyelesaian kepada masalah ini ialah untuk menentukan templat fungsi yang sepadan dengan semua jenis lain. Teknik ini mengutamakan fungsi templat untuk jenis tidak sepadan, menghalangnya daripada dihantar ke fungsi asal dengan tandatangan fungsi yang tepat.

Contoh:

// Original function signature requires an int
void function(int);

// Function template matches all other types
template <class T>
void function(T) = delete; // C++11 
Salin selepas log masuk

Pendekatan ini memastikan bahawa fungsi asal dengan fungsi tandatangan yang tepat(int) hanya digunakan apabila hujah integer diluluskan. Apa-apa sahaja, seperti aksara atau longs, mencetuskan templat fungsi dan mengakibatkan ralat penyusunan.

Kaedah Pra-C 11:

Untuk versi C sebelum C 11, teknik yang berbeza boleh digunakan:

// Creating a class to handle overload deletion
class DeleteOverload {
private:
    DeleteOverload(void*);
};

// Function template with overload deletion
template <class T>
void function(T a, DeleteOverload = 0);

// Original function with exact signature
void function(int a) {}
Salin selepas log masuk

Dalam pendekatan ini, kelas DeleteOverload tidak boleh instantiated, berkesan melarang penggunaannya sebagai hujah templat. Ini memaksa semua jenis tidak sepadan untuk mencetuskan fungsi templat dan melarangnya daripada mencapai fungsi asal dengan tandatangan yang tepat.

Versi C 23:

C 23 memperkenalkan ciri static_assert, yang boleh digunakan untuk lebih jelas dalam hal ini senario:

void function(int); // Chosen for ints

template <class T>
void function(T) {
    static_assert(false, "function should only be called for ints");
}

int main() {
    function(1);
    // function(1l); // Error: static assertion failed
}
Salin selepas log masuk

Dengan menggunakan kaedah ini, mesej ralat dengan jelas menyampaikan bahawa fungsi itu bertujuan semata-mata untuk integer, meningkatkan kebolehbacaan dan pemahaman kod.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Penukaran Tersirat untuk Jenis Fungsi Tidak Padanan dalam C ?. 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