Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menyelesaikan Kekaburan Apabila Melewati Penunjuk Fungsi Terlebih dalam C?

Bagaimana untuk Menyelesaikan Kekaburan Apabila Melewati Penunjuk Fungsi Terlebih dalam C?

Barbara Streisand
Lepaskan: 2024-12-24 11:16:11
asal
498 orang telah melayarinya

How to Resolve Ambiguity When Passing Overloaded Function Pointers in C  ?

Penunjuk Fungsi Terlebih dalam C

Dalam C , fungsi terlebih beban ialah fungsi dengan berbilang pelaksanaan dengan tandatangan yang berbeza. Apabila fungsi terlebih beban diserahkan kepada algoritma generik, mungkin sukar untuk menentukan pelaksanaan yang harus digunakan.

Pertimbangkan contoh berikut:

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

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f); // Overloaded function passed to 'for_each'
    }
};
Salin selepas log masuk

Di sini, kami mempunyai kelas A dengan dua fungsi ahli yang terlebih beban bernama f yang masing-masing mengambil char dan int sebagai parameter. Fungsi ahli imbasan A cuba menggunakan algoritma for_each untuk mengulangi rentetan, memanggil fungsi f untuk setiap aksara.

Masalah:

Walau bagaimanapun, pengkompil tidak boleh secara automatik menentukan pelaksanaan f yang harus digunakan apabila dihantar ke std::for_each. Ini kerana algoritma menjangkakan penuding fungsi dengan tandatangan tertentu dan tandatangan fungsi yang terlebih beban tidak boleh dibezakan antara satu sama lain berdasarkan jenis penuding fungsi generik.

Penyelesaian:

Untuk menentukan lebihan f untuk digunakan, kami boleh menggunakan salah satu daripada yang berikut teknik:

1. Cast Statik dengan Tandatangan Fungsi:

Kita boleh menggunakan static_cast<>() untuk menghantar penuding fungsi ke tandatangan khusus yang diperlukan oleh std::for_each:

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

2. Pengisytiharan Penunjuk Fungsi:

Sebagai alternatif, kami boleh mengisytiharkan penunjuk fungsi dengan tandatangan yang diingini dan menetapkannya kepada fungsi terlampau beban:

void (*fpc)(char) = &A::f; // Function pointer for void f(char c)
std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload

void (*fpi)(int) = &A::f; // Function pointer for void f(int i)
std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
Salin selepas log masuk

Untuk Fungsi Ahli (Pilihan) :

Jika fungsi terlebih beban adalah fungsi ahli, utiliti mem_fun boleh digunakan, atau penyelesaian yang disediakan dalam artikel Dr. Dobb yang dipautkan boleh digunakan untuk menentukan lebihan beban yang diingini.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kekaburan Apabila Melewati Penunjuk Fungsi Terlebih 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