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' } };
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));
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
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!