Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menyimpan fungsi dengan tandatangan yang berbeza dalam peta dalam C?

Bagaimanakah saya boleh menyimpan fungsi dengan tandatangan yang berbeza dalam peta dalam C?

Patricia Arquette
Patricia Arquetteasal
2024-11-13 12:32:02729semak imbas

How can I store functions with different signatures in a map in C  ?

Fungsi Simpan dengan Tandatangan Berbeza dalam Peta

Dalam C , anda boleh menghadapi senario di mana anda perlu menyimpan fungsi dengan tandatangan berbeza dalam struktur data. Katakan anda mempunyai bekas peta yang menerima kunci rentetan dan kaedah generik sebagai nilainya. Untuk menjadikannya mungkin, pertimbangkan pendekatan berikut:

Jenis Pemadaman dan Sebarang Jenis

C menyediakan std::sebarang jenis untuk jenis pemadaman. Anda boleh menggunakan std::any untuk menyimpan penunjuk fungsi atau ungkapan lambda dalam bekas tanpa menyatakan jenis tepatnya. Walau bagaimanapun, untuk menggunakan fungsi yang disimpan, anda perlu menghantarnya ke jenis yang betul secara eksplisit.

Operator Overloading for Function Invocation

Untuk mengatasi penghantaran eksplisit, anda boleh menentukan operator operator templat( ) pada kelas pembalut tersuai yang mengambil std::any object yang disimpan sebagai parameter. Operator ini membenarkan anda menggunakan fungsi tersimpan tanpa memerlukan penghantaran eksplisit.

Contoh Pelaksanaan

Berikut ialah contoh pelaksanaan kelas pembalut sedemikian:

template<typename Ret>
struct AnyCallable
{
    AnyCallable() {}
    template<typename F>
    AnyCallable(F&& fun) : AnyCallable(std::function(std::forward<F>(fun))) {}
    template<typename ... Args>
    AnyCallable(std::function<Ret(Args...)> fun) : m_any(fun) {}
    template<typename ... Args>
    Ret operator()(Args&& ... args) 
    { 
        return std::invoke(std::any_cast<std::function<Ret(Args...)>>(m_any), std::forward<Args>(args)...); 
    }
    std::any m_any;
};

Dalam pelaksanaan ini, kelas AnyCallable membungkus std::any object yang disimpan dan menyediakan operator() yang memanggil fungsi dengan hujah yang ditentukan.

Penggunaan Contoh

Dengan kelas AnyCallable, anda boleh mencipta peta yang menyimpan fungsi dengan tandatangan berbeza dan menggunakannya secara dinamik:

void foo(int x, int y) { /* ... */ }
void bar(std::string x, int y, int z) { /* ... */ }

std::map<std::string, AnyCallable<void>> map;
map["foo"] = &foo;
map["bar"] = &bar;
map["foo"](1, 2);
map["bar"]("Hello", 1, 2);

Pertimbangan

Perhatikan bahawa apabila menggunakan fungsi yang disimpan dengan cara yang dipadamkan, anda perlu lulus jenis hujah yang betul secara eksplisit. Jenis ketidakpadanan akan mengakibatkan pengecualian std::bad_any_cast.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menyimpan fungsi dengan tandatangan yang berbeza dalam peta 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