Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-11-18 07:53:02
asal
257 orang telah melayarinya

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;
};
Salin selepas log masuk

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;
Salin selepas log masuk

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);
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan