Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann ich mit C Funktionen mit unterschiedlichen Signaturen in einer Karte speichern?

Patricia Arquette
Freigeben: 2024-11-11 21:59:02
Original
398 Leute haben es durchsucht

How can I store functions with varying signatures in a map using C  ?

Funktionen mit unterschiedlichen Signaturen in einer Karte speichern

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.

Implementierung der Karte

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.

Beispielimplementierung

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;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage