Menyimpan Fungsi dengan Pelbagai Tandatangan dalam Peta
Dalam C , anda mungkin menghadapi keperluan untuk menyimpan fungsi dengan tandatangan yang berbeza-beza dalam peta, di mana kuncinya ialah rentetan dan nilainya ialah kaedah generik. Walaupun ini pada mulanya kelihatan mencabar, ia boleh dilakukan dengan bantuan pemadaman jenis dan pengendali templat.
Pemadaman Jenis
Untuk mendayakan fungsi menyimpan dengan tandatangan berbeza dalam peta , kami mula-mula menaip-memadamkannya ke dalam bekas. Ini melibatkan penukaran jenis fungsi kepada perwakilan biasa yang boleh disimpan dan diambil daripada peta.
Operator Templat
Setelah jenis fungsi telah dipadamkan, kami menyediakan operator templat () untuk peta. Operator ini mengambil fungsi tersimpan sebagai input dan membolehkan kami memanggilnya dengan parameter tertentu semasa masa jalan. Parameter yang disediakan mesti sepadan dengan tandatangan fungsi asal dengan tepat. Jika tidak, pengendali akan memberikan pengecualian std::bad_any_cast.
Contoh
Berikut ialah contoh bagaimana ini boleh dilaksanakan:
#include <any> #include <functional> #include <map> #include <string> #include <iostream> template<typename Ret> struct AnyCallable { //... }; void foo(int x, int y) { //... } void bar(std::string x, int y, int z) { //... } using namespace std::literals; int main() { // Initialize the map std::map<std::string, AnyCallable<void>> map; // Store functions in the map map["foo"] = &foo; map["bar"] = &bar; // Call the stored functions with parameters map["foo"](1, 2); map["bar"]("Hello, std::string literal"s, 1, 2); }
Dalam contoh ini, kami mentakrifkan struktur pembalut AnyCallable yang memadam taip fungsi dan menyediakan operator templat () untuk memanggilnya.
Pertimbangan
Atas ialah kandungan terperinci Bagaimanakah saya boleh menyimpan fungsi dengan tandatangan yang berbeza-beza dalam peta dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!