In diesem Code wollen wir eine Karte erstellen, die Funktionen mit unterschiedlichen Signaturen speichert und dabei eine Zeichenfolge als Schlüssel und nutzt eine generische Methode als Wert.
Wir verwenden die std::any-Bibliothek, um dies zu erreichen Das. Durch typografisches Löschen der Funktionstypen in einem Container können wir eine Vorlagenfunktion „operator()“ erstellen, um sie dynamisch aufzurufen. Es ist jedoch wichtig, genaue Argumentübereinstimmungen auf der Aufrufseite anzugeben, um std::bad_any_cast-Ausnahmen zu vermeiden.
Beachten Sie den folgenden Codeausschnitt:
#include <any> #include <functional> #include <map> #include <string> #include <iostream> using namespace std::literals; 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; }; void foo(int x, int y) { std::cout << "foo" << x << y << std::endl; } void bar(std::string x, int y, int z) { std::cout << "bar" << x << y << z << std::endl; } int main() { std::map<std::string, AnyCallable<void>> map; map["foo"] = &foo; //store the methods in the map map["bar"] = &bar; map["foo"](1, 2); //call them with parameters I get at runtime map["bar"]("Hello, std::string literal"s, 1, 2); try { map["bar"]("Hello, const char *literal", 1, 2); // bad_any_cast } catch (std::bad_any_cast&) { std::cout << "mismatched argument types" << std::endl; } map["bar"].operator()<std::string, int, int>("Hello, const char *literal", 1, 2); // explicit template parameters return 0; }
Dieser Code zeigt, wie Funktionen mit unterschiedlichen Signaturen innerhalb einer Karte gespeichert und aufgerufen werden, indem Typlöschung und eine Vorlage verwendet werden Operator().
Das obige ist der detaillierte Inhalt vonWie kann ich mit C Funktionen mit unterschiedlichen Signaturen in einer Karte speichern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!