String als Kommando auslesen



  • Folgende Problematik:

    Ich habe eine simple Funktion, sagen wir:

    void execute();

    Ihc möchte nun über eine Konsole einen String einladen - und dieser String ("execute();") soll genutzt werden, die Funktion zu starten.

    Gibt es irgendeine C++ - Prozedur, die dergleichen bewirken kann?



  • Schau Dir mal System::Diagnostic::Process::Start an.



  • Hallo,

    Knuddlbaer schrieb:

    Schau Dir mal System::Diagnostic::Process::Start an.

    Sorry, aber ich glaube nicht, dass dies ist, wonach er sucht. 😉

    Wenn dir ein normaler if-else -Block nicht mehr ausreicht weil du viele solche Funktionen hast, hast du im Prinzip 2 Möglichkeiten, dein Vorhaben zu verwirklichen:

    • Du machst es auf die klassische Art und Weise und baust eine Look-up-Tabelle mit System::String s als Keys und delegate s als Values, also etwas in der Form von System::Collections::Generic::Dictionary<System::String ^, __DELEGATE_TYP_MIT_ENTSPRECHENDER_SIGNATUR__ ^> ^ . Dort trägst du alle Funktionen, welche du brauchst mit ihrem Namen (es ist auch möglich, ihnen andere Namen zu geben, kleine Bemerkung am Rande :p) als Key ein, meinetwegen mittels einer Makro-Vergewaltigung damit du nicht zu viel Tippen musst 😃 . Dann kannst du die Eingabe jeweils auf den Funktionsnamen runter strippen (aus "execute();" mach "execute" ) und mit diesem String dann das entsprechende Delegate aus der Tabelle laden und die Funktion aufrufen. Das ist die einfache Variante, welche meiner Meinung nach genügen sollte.
    • Der zweite und allgemeinere Weg führt über Reflection und ist eleganter, aber auch komplizierter. Über System::Type kannst du mittels der jeweiligen Instanz von System::Reflection::MethodBase praktisch jede Methode in deinem Assembly ansprechen. Du könntest nun deine Funktionen, welche für das Look-up in Frage kommen, mit einem speziellen Attribut markieren und per Reflection wieder in eine Look-up-Tabelle laden. Oder im Extremfall kannst du sogar dynamisch bei jedem Aufruf dein Assembly nach einer Funktion mit entsprechendem Namen durchsuchen, was dann auch ohne die Attribute geht (ich würde dann vermutlich besser anfangen die Funktionen zu cachen, da es für die Performance nicht gerade förderlich ist, wenn man die ganze Zeit in den Metadaten herumkniet ;)). Per Reflection bist du auf jeden Fall flexibler, aber es geht halt einige Zeit, bis man damit vertraut ist 🙂

    MfG



  • Jetzt wo Du es sagst fällt es mir auch auf ;o)

    http://de.wikipedia.org/wiki/Abstrakte_Fabrik


Anmelden zum Antworten