Funktionen mit eindeutigen Signaturen in einer Karte speichern
In C stellt das Erstellen einer Karte mit Zeichenfolgenschlüsseln und generischen Funktionen als Werte eine Herausforderung dar. Dies kann jedoch durch die Verwendung einer Kombination aus Typlöschung und einem auf Vorlagen basierenden Operator() erreicht werden.
Typlöschung ermöglicht die Speicherung verschiedener Funktionstypen in einem einzigen Container, während der auf Vorlagen basierende Operator() Zugriff darauf bietet gespeicherte Funktionen. Das folgende Codebeispiel veranschaulicht diesen Ansatz:
#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); }
In dieser Lösung fungiert die AnyCallable-Klasse als Wrapper um die gespeicherten Funktionen und stellt den vorlagenbasierten Operator() bereit. Die Funktionszeiger &foo und &bar werden in std::function-Objekte konvertiert, bevor sie im m_any-Member gespeichert werden. Wenn die gespeicherten Funktionen aufgerufen werden, werden sie in den entsprechenden Funktionstyp umgewandelt und ausgeführt.
Es ist wichtig zu beachten, dass aufgrund der Typlöschung passende Argumente an der Aufrufstelle bereitgestellt werden müssen. Darüber hinaus ist die Konstanz von Funktionsargumenten von Bedeutung, da unterschiedliche Überladungen mit der gleichen Anzahl von Argumenten, aber unterschiedlichen Qualifizierern erstellt werden können.
Das obige ist der detaillierte Inhalt vonWie speichere ich Funktionen mit unterschiedlichen Signaturen in einer Karte in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!