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.
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.
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!