Menyimpan Fungsi dengan Tanda Tangan Berbeza dalam Peta
Dalam C , mencipta peta dengan kekunci rentetan dan fungsi generik kerana nilai menimbulkan cabaran. Walau bagaimanapun, dengan menggunakan gabungan pemadaman jenis dan operator templat(), ini boleh dicapai.
Pemadaman jenis membenarkan penyimpanan jenis fungsi yang berbeza dalam satu bekas, manakala operator templat() menyediakan akses kepada fungsi yang disimpan. Contoh kod di bawah menunjukkan pendekatan ini:
#include <any> #include <functional> #include <map> #include <string> template<typename Ret> struct AnyCallable { template<typename ... Args> Ret operator()(Args&& ... args) { ... } std::any m_any; }; void foo(int x, int y) { ... } void bar(std::string x, int y, int z) { ... } int main() { std::map<std::string, AnyCallable<void>> map; map["foo"] = &foo; map["bar"] = &bar; map["foo"](1, 2); map["bar"]("Hello", 1, 2); }
Dalam penyelesaian ini, kelas AnyCallable bertindak sebagai pembalut di sekeliling fungsi yang disimpan, menyediakan operator templat(). Penunjuk fungsi &foo dan &bar ditukar kepada objek std::function sebelum disimpan dalam m_any member. Apabila fungsi yang disimpan dipanggil, ia dihantar ke jenis fungsi yang sesuai dan dilaksanakan.
Adalah penting untuk ambil perhatian bahawa disebabkan pemadaman jenis, argumen yang sepadan mesti disediakan di tapak panggilan. Tambahan pula, ketegasan argumen fungsi adalah penting, kerana lebihan yang berbeza mungkin dibuat dengan bilangan argumen yang sama tetapi kelayakan yang berbeza.
Atas ialah kandungan terperinci Bagaimana untuk Menyimpan Fungsi dengan Tandatangan Berbeza dalam Peta dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!