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
Mary-Kate Olsenasal
2024-11-30 11:39:12662semak imbas

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 

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) {}

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
}

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!

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