Ich habe mehrere Funktionen in meinem Programm, die so aussehen:
%Vor%Nun möchte ich, dass mein Programm eine Zeichenfolge wie folgt annimmt:
%Vor%Und führen Sie die entsprechende Funktion aus. Was ist der einfachste Weg dies zu implementieren?
Wenn ich gradlinig sage, meine ich einigermaßen erweiterbar und elegant, aber es sollte nicht zu lange dauern, es zu kodieren.
Bearbeiten:
Obwohl die Verwendung einer echten Skriptsprache mein Problem natürlich lösen würde, würde ich gerne wissen, ob es eine schnelle Möglichkeit gibt, dies in reinem C ++ zu implementieren.
Ich würde mich auch für die Antwort in der Skriptsprache entscheiden.
Unter Verwendung von reinem C ++ würde ich wahrscheinlich einen Parser-Generator verwenden, der die Token- und Grammatikregeln erhält und mir C-Code liefert, der die gegebene Funktionsaufrufsprache genau parsen kann, und mir einen Syntaxbaum dafür liefert Anruf. flex
kann verwendet werden, um eine Eingabe zu token und bison
kann verwendet werden, um die Token zu analysieren und in einen Syntaxbaum zu transformieren. Alternativ zu diesem Ansatz kann Boost Spirit verwendet werden, um die Funktion zu parsen Sprache auch anrufen. Ich habe noch nie eines dieser Tools benutzt, sondern habe an Programmen gearbeitet, die sie benutzen, daher weiß ich etwas, was ich verwenden würde, falls ich dieses Problem lösen müsste.
In sehr einfachen Fällen können Sie Ihre Syntax wie folgt ändern:
%Vor%Dann können Sie verwenden:
%Vor%Die Karte wäre ein
%Vor% Welches wäre mit den Funktionen am Anfang Ihres Programms gefüllt. tokenize_args
würde nur die Argumente trennen und einen Vektor von ihnen als Zeichenfolgen zurückgeben. Natürlich ist das sehr primitiv, aber ich denke, es ist vernünftig, wenn Sie nur eine Möglichkeit haben möchten, eine Funktion aufzurufen (wenn Sie wirklich Script-Unterstützung wünschen, reicht dieser Ansatz nicht aus).
Sie können Python ziemlich einfach einbetten, und das würde Ihnen eine wirklich mächtige, erweiterbare Möglichkeit geben, Ihr Programm zu skripten. Sie können Folgendes verwenden, um Ihren C ++ - Code leicht (mehr oder weniger) für Python verfügbar zu machen:
Ich persönlich benutze Boost Python und ich bin damit zufrieden, aber es ist langsam zu kompilieren und kann schwierig zu debuggen sein.
Wie Daniel sagte:
Skriptsprachen wie Lua und Python wären die am häufigsten verwendeten Skriptsprachen für die Bindung von C ++ - Bibliotheken.
Sie müssen Ihrer c ++ - Anwendung eine Skriptschnittstelle hinzufügen. Der Aufbau dieser Schnittstelle hängt natürlich davon ab, welche Skriptsprache Sie gewählt haben.
CERN bietet CINT , einen C / C ++ - Interpreter, der in Ihre Anwendung eingebettet werden kann, um Skriptfunktionen bereitzustellen.
Wenn Sie eine Funktion nur über den Literalnamen aufrufen möchten, können Sie Linker-spezifische Funktionen verwenden.
Auf POSIX-kompatiblen Betriebssystemen (wie Linux) können Sie dlopen () und dlsym () verwenden. Sie analysieren einfach die Eingabezeichenfolge und ermitteln den Funktionsnamen und die Argumente. Dann können Sie den Linker bitten, die Funktion anhand des Namens mithilfe von dlsym () zu finden.
Unter Windows sind diese Funktionen jedoch nicht verfügbar (es sei denn, es gibt eine POSIX-Umgebung wie Cygwin). Aber Sie können die Windows-API verwenden.
Sie können hier nach Einzelheiten zu diesen Dingen suchen: Ссылка
C ++ Reflection [2] von Fabio Lombardelli bietet eine vollständige Neudefinition für C ++ durch Template-Metaprogrammierungs-Techniken. Obwohl es vollständig den C ++ - Standards entspricht, muss der Programmierer die Klassen annotieren, damit sie reflektierend sind.
sonst würden Sie eine Funktionszeiger-Hash-Tabelle wollen, denke ich
Muss Ihr System "eine Kette" nehmen? Sie könnten COM- (oder CORBA- oder was auch immer) -Schnittstellen in Ihrer Anwendung verfügbar machen und alles, was diese Befehle generiert, direkt in Ihre Anwendung aufrufen.