Funktionspointer

HansKloss

Grünschnabel
Hi Leute, hab folgendes Problem und hoffe, dass mir jemand weiter helfen kann. Ich suche eine Möglichkeit durch einen String, der einen Methodennamen enthält, einem Funktionspointer die Methode zuzuordnen. Leider weiss ich nicht wie man diese Verbindung von einem String zu einer Methode zieht :( . Ich bin über alle Vorschläge dankbar.

Schönen Tag noch ;-)
 
Hi,
also eine andre Möglichkeit als if Abfragen sehe ich da nicht...
allerdings wirst du dann wohl auf Compilerfehlermeldungen verzichten müssen, oder du
verwendest gleich Funkltionspointer? Was spricht eigentlich gegen sie?

Bsp.:

Code:
#include <iostream>

using namespace std;

void printGreen(string word){

        cout << "\033[32m";
        cout << word << endl;
        cout << "\033[39m";
}

void printBlue(string word){

        cout << "\033[34m";
        cout << word << endl;
        cout << "\033[39m";
}

/** Call by function pointer*/
void print(string word, void (*pf)(string)){ 

        pf(word);

}

/** Call by function name as string */
void print(string word, string functioname){

        if(functioname == "printBlue")
                printBlue(word);
        if(functioname == "printGreen")
                printGreen(word);
}
int main(void){

        print("Mulitcolor", printBlue);
        print("Mulitcolor", printGreen);
        print("Mulitcolor", "printBlue");
        print("Mulitcolor", "printGreen");
        
        return 0;
}

Gruß

RedWing
 
Man kann die Beziehung zwischen Funktionsnamen und Funktionspointer doch viel schöner mit einer Map realisieren:
Code:
#include <map>

using namespace std;

void FuncA( string text )
{
  // tu was
}

void FuncB( string text )
{
  // tu was anderes
}

// Funktionspointer für eine void-Func, die einen string als Parameter nimmt
typedef void (*funpointer)( string text ); 
//( wahrscheinlich mit Tippfehlern)

typedef map< string, FunPointer > funpointer_map_type;

funpointer_map_type Functions;

int main()
{
  Functions[ "FuncA" ] = FuncA;
  Functions[ "FuncB" ] = FuncB;
  
  string test = "HURZ!";
  
  (*Functions[ "FuncA" ])( test );
  (*Functions[ "FuncB" ])( test );

  return 0;
}

Habe es nicht getestet, deshalb ohne Gewähr.
Es geht auch sicherlich eleganter und sicherer.
 
Hi,
ich danke euch für die rasche Hilfe. Die Idee mit dem Map hat mich sofort begeistert. Also was soll ich sagen, habs ausprobiert und es hat tadellos funktioniert. Danke euch nochmals.
Ciao
 
ES freut mich sehr, dass es geklappt hat, besonders weil ich keine Zeit zum Testen hatte.
Noch eine (nicht so wichtige) Anmerkung am Rande: Besser keine strings per Wert übergeben, sondern per konstanter Referenz, damit die Dinger nicht ständig kopiert werden müssen. Dafür müsstest du die Signatur der Funktionen so ändern (ebenso beim funpointer-typedef):
Code:
void FuncB( const string& text )
Ich erwähne das nur, weil ich sonst sehr darauf achte, es so zu machen und mich über meine zeitmangelbedingte Schlampigkeit ärgere. ;)
 
Danke für den Hinweis. Achte aber sonst auch immer darauf, dass ich wo irgend möglich, Referenzen übergebe. Ausserdem muss ich den Funktionen keine Strings übergeben sondern Zeitwerte, sprich Integers, wo es meiner Ansicht nach überflüssig ist Referenzen zu übergeben. Sicherheit geht vor Preformance (bei ints). Danke für Alles.
Ciao ;-)
 
Zurück