Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyelesaikan Kekaburan Apabila Melepasi Fungsi Terlalu Beban ke std::for_each()?

Bagaimana untuk Menyelesaikan Kekaburan Apabila Melepasi Fungsi Terlalu Beban ke std::for_each()?

Linda Hamilton
Linda Hamiltonasal
2024-12-17 07:00:261006semak imbas

How to Resolve Ambiguity When Passing Overloaded Functions to 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)>(&amp;f));
// Uses the void f(int i); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(&amp;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) = &amp;f;
std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload
void (*fpi)(int) = &amp;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!

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