Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menentukan Penunjuk kepada Fungsi Terlebih Beban dalam C?

Bagaimanakah Saya Boleh Menentukan Penunjuk kepada Fungsi Terlebih Beban dalam C?

Barbara Streisand
Barbara Streisandasal
2024-12-30 05:03:08934semak imbas

How Can I Specify a Pointer to an Overloaded Function in C  ?

Menentukan Penuding kepada Fungsi Terlebih Beban

Dalam alam C , tidak jarang terdapat fungsi terlampau beban yang berkongsi nama yang sama tetapi berbeza dalam parameter input mereka. Ini memberikan cabaran apabila cuba menghantar fungsi tersebut sebagai argumen kepada algoritma generik seperti std::for_each().

Fungsi Terlebih Beban Bersarang Dalam Kelas

Pertimbangkan perkara berikut contoh, apabila beban berlebihan berlaku dalam kelas:

class A {
public:
    void f(char c);
    void f(int i);

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f);
    }
};

Di sini, memanggil kaedah scan() dengan rentetan menyebabkan pengkompil tidak pasti tentang pelaksanaan f yang hendak digunakan. Secara lalai, f() akan mengambil aksara sebagai hujah. Walau bagaimanapun, pengguna mungkin berhasrat untuk menggunakan lebihan beban yang menerima integer.

Tugas Penunjuk Eksplisit

Untuk menyelesaikan kekaburan ini, adalah mungkin untuk menentukan lebihan yang diingini secara eksplisit menggunakan static_cast<>():

// Uses the void f(char c); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(char)>(f));
// Uses the void f(int i); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(f));

Dengan menghantar penunjuk fungsi kepada jenis yang sesuai, anda boleh secara jelas menunjukkan kepada pengkompil yang lebihan beban harus dipanggil.

Kaedah Alternatif Menggunakan Penunjuk Fungsi

Pendekatan lain ialah mengisytiharkan fungsi penunjuk secara eksplisit:

// The compiler will figure out which f to use according to
// the function pointer declaration.
void (*fpc)(char) = &f;
std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload
void (*fpi)(int) = &f;
std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload

Dengan mencipta penunjuk fungsi dengan tandatangan tertentu, pengkompil boleh menentukan secara automatik lebihan beban yang betul untuk digunakan.

Pengendalian Fungsi Ahli

Jika fungsi terlebih beban ialah fungsi ahli, pendekatan yang berbeza diperlukan. Pertimbangkan untuk menggunakan templat mem_fun atau rujuk sumber tambahan, seperti artikel Dr. Dobb yang dipautkan dalam jawapan yang disediakan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Penunjuk kepada Fungsi Terlebih Beban 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