Punktoperator "variabler Funktionsaufruf"



  • Guten Tag,

    Hier spricht ein Azubi aus der ersten Lehrjahr, der bisher nur C++ kennengelernt hat. Meine Frage folgt nach der erläuterung der Situation.

    Meine Aufgabe ist es, einen Encodingconverter zu entwickeln, der in erster Linie zwischen UTF8 und WIN1252 hin und her kodieren kann. Dabei habe ich vor über den Codepoint zu gehen ( Das Thema Encoding spielt bei meiner Frage kaum eine Rolle, ist aber trotzdem hilfreich zu wissen ). Gefordert ist, dass Informationen wie Dateipfad einer Datei, Ursprungsencoding sowie Zielencoding als Parameter in der Konsole übergeben werden(argc,argv[]). Alles kein Problem.

    Angenommen meine Datei hat das Encoding UTF8. Es soll die Funktion aufgerufen werden, die UFT8 nach Codepoint konvertiert ( Converter.vonUTF8() ). Nun soll die nächste Funktion aufgerufen werden, die von Codepoint nach WIN1252 konvertiert ( Converter.nachWin1252() ). Später sollen aber auch andere Encodings zu konvertieren sein ( z.B. Converter.nachUTF16() ).

    Der sprigende Punkt ist: Ich könnte das mithilfe einer If abfragen, welches Encoding meine datei hat ( wird ja als Parameter übergeben ), dabei entsteht aber später eine relativ große Verschachtelung an abfragen, weil jedes Verhältnis zwischen zwei Encodings, also jeder Fall, einzeln abgefragt werden muss.

    Nun zur Frage: Gibt es eine Möglichkeit in C++, einen Funktionsaufruf variabel zu gestalten? Hier mal ungefähr dargestellt wie ich das meine:

    Converter.argv[2]();

    Das ist natürlich syntaktisch nicht korekt, aber ich hoffe die Idee ist klar. Auf diese Weise müsste ich nur 2 Funktionen aufrufen, die mir meine Datei konvertieren, ohne eine einzige If für das Auswählen der Funktionen nutzen zu müssen.

    Mein Ausbilder hat mir einen kleinen Hinweis gegeben: "Dictionary", aber daraus werde ich noch nicht wirklich schlau.

    Danke für jeden verschwendeten Gedanken.

    mfg replayleif



  • Warum nimmst du nicht etwas Fertiges, zum Beispiel iconv ?

    replayleif schrieb:

    Dabei habe ich vor über den Codepoint zu gehen

    replayleif schrieb:

    Angenommen meine Datei hat das Encoding UTF8. Es soll die Funktion aufgerufen werden, die UFT8 nach Codepoint konvertiert ( Converter.vonUTF8() ). Nun soll die nächste Funktion aufgerufen werden, die von Codepoint nach WIN1252 konvertiert ( Converter.nachWin1252() ).

    Du verwendest den Begriff Codepoint, als wüsstest du nicht wirklich, was er bedeutet. Vielleicht verwechselst du den mit Unicode.

    replayleif schrieb:

    Der sprigende Punkt ist: Ich könnte das mithilfe einer If abfragen, welches Encoding meine datei hat ( wird ja als Parameter übergeben ), dabei entsteht aber später eine relativ große Verschachtelung an abfragen, weil jedes Verhältnis zwischen zwei Encodings, also jeder Fall, einzeln abgefragt werden muss.

    Wenn du über Unicode gehst, brauchst du nicht N mal M, sondern nur N + M Abfragen. N steht für die Anzahl der Kodierungen der Eingaben und M für die Ausgabekodierungen.
    Du machst auf jeden Fall etwas falsch, wenn in derselben Funktion sowohl die Ein- als auch die Ausgabekodierung mit etwas verglichen werden.

    replayleif schrieb:

    Nun zur Frage: Gibt es eine Möglichkeit in C++, einen Funktionsaufruf variabel zu gestalten? Hier mal ungefähr dargestellt wie ich das meine:

    Converter.argv[2]();

    Das ist natürlich syntaktisch nicht korekt, aber ich hoffe die Idee ist klar. Auf diese Weise müsste ich nur 2 Funktionen aufrufen, die mir meine Datei konvertieren, ohne eine einzige If für das Auswählen der Funktionen nutzen zu müssen.

    Mein Ausbilder hat mir einen kleinen Hinweis gegeben: "Dictionary", aber daraus werde ich noch nicht wirklich schlau.

    Das ist ein Irrweg, der dich vom eigentlichen Thema ablenkt. Zehn if s hintereinander sind nicht so schlimm für einen Anfänger. Komm wieder, wenn es 30 if s werden.



  • Dein Betreuer meint eine assoziative Datenstruktur, also z.B. std::map.
    Hier koenntest du Zeiger auf Funktionen oder besser std::functions speichern, mit std::string als Schluessel.
    Dann kriegst du die korrekte Funktion so:

    std::function<std::string(std::string)> func = func_map["vonUTF8"]; // funktionssignatur ist geraten
    

    Ich verstehe dein Problem aber nicht so ganz. Bring doch jeden String ersteinmal in ein bestimmtes Encoding, z.B. UTF8. Anschliessend kannst du in das gewunschte Zielencoding konvertieren. Das ist natuerlich etwas aufwendiger, aber ist Perfomance ein Problem?


Log in to reply