Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyelesaikan Kekaburan Apabila Melepasi Fungsi Terlalu Beban ke std::for_each()?
Melalui Fungsi Terlebih Beban ke std::for_each()
Apabila bekerja dengan fungsi terlebih beban dalam C , anda mungkin menghadapi situasi di mana anda perlu lulus salah satu beban ini kepada algoritma seperti std::for_each(). Pengkompil, bagaimanapun, mungkin tidak secara automatik menentukan lebihan beban yang betul untuk digunakan berdasarkan jenis lelaran.
Contoh:
Pertimbangkan kelas berikut dengan dua lebihan f () fungsi:
class A { void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); // Error! } };
Ralat pengkompil timbul kerana panggilan ke f() adalah samar-samar. Untuk menyelesaikan masalah ini, anda perlu menyatakan secara eksplisit beban yang anda ingin gunakan.
Penyelesaian 1: Menggunakan static_cast<>()
Satu cara untuk melakukan ini ialah untuk menggunakan static_cast<>() untuk menghantar penuding fungsi ke tandatangan yang sesuai, seperti yang ditunjukkan di bawah:
// 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));
Penyelesaian 2: Pengisytiharan Penunjuk
Sebagai alternatif, anda boleh menggunakan pengisytiharan penuding yang secara tersirat menyatakan tandatangan fungsi. Pendekatan ini membolehkan pengkompil untuk secara automatik menyimpulkan lebihan beban yang betul untuk dipanggil:
// 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
Fungsi Ahli
Jika fungsi f() ialah fungsi ahli, anda akan perlu menggunakan mem_fun atau merujuk kepada penyelesaian yang dibincangkan dalam artikel Dr. Dobb ini.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kekaburan Apabila Melepasi Fungsi Terlalu Beban ke std::for_each()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!