Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Anda Boleh Menyimpan Fungsi dengan Tandatangan Tidak Homogen dalam Peta dalam C ?

Bagaimanakah Anda Boleh Menyimpan Fungsi dengan Tandatangan Tidak Homogen dalam Peta dalam C ?

Linda Hamilton
Linda Hamiltonasal
2024-11-18 07:53:02200semak imbas

How Can You Store Functions with Non-Homogeneous Signatures in a Map in C  ?

Menyimpan Fungsi dengan Tandatangan Bukan Homogen dalam Peta

Pengenalan Masalah

Dalam C , timbul keperluan untuk mengaitkan fungsi dengan tandatangan yang berbeza dengan tandatangan yang unik pengecam untuk seruan dinamik berdasarkan argumen masa jalan. Walau bagaimanapun, bekas standard tidak menyokong penyimpanan jenis fungsi bukan homogen secara langsung.

Menggunakan Operator Pemadaman Jenis dan Templat

Satu pendekatan untuk mengatasi had ini ialah pemadaman jenis, yang melibatkan fungsi pengekapan taip ke dalam bekas yang memadamkan maklumat jenis tertentu. Ini membolehkan penyimpanan seragam fungsi dengan tandatangan yang berbeza-beza. Untuk memudahkan proses ini, struktur data tersuai, AnyCallable, ditakrifkan:

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;
};

AnyCallable menerima jenis fungsi heterogen dan menyediakan operator generik() untuk menggunakan fungsi enkapsulasi dengan hujah yang sepadan.

Contoh Pelaksanaan

Menggunakan struktur data AnyCallable, kini kita boleh mencipta peta yang menyimpan fungsi dengan tandatangan berbeza:

std::map<std::string, AnyCallable<void>> map;
map["foo"] = &foo;
map["bar"] = &bar;

Untuk menggunakan fungsi secara dinamik berdasarkan pengecam rentetan uniknya, kami menggunakan operator() yang disediakan oleh AnyCallable:

map["foo"](1, 2);
map["bar"]("Hello", 1, 2);

Pendekatan ini memastikan jenis keselamatan dan penggunaan dinamik fungsi dengan tandatangan tidak homogen, menjadikannya penyelesaian serba boleh untuk menyimpan dan melaksanakan penunjuk kaedah dengan input berbeza.

Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Menyimpan Fungsi dengan Tandatangan Tidak Homogen 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