Variable Funktionen, geht das?
-
Hallo zusammen,
ich möchte eine Funktion schreiben um zu "threaden". z.B.: Ich rufe die Funktion
pthread_create(&thread,0,threadIt,(void*) "makeAudioCall|(int)4,(int)7,(string)/dev/ttyI0")
diese Funktion kümmert sich dann um die Dekodierung des (void*) blah, blah, strings, weist den resultierenden Strings den richtigen Typ zu und ruft dann die Funktion:
makeAudiocall(int[0],int[1],string[0])
auf.
Ist sowas möglich?
-
Ja, allerdings musst du den String parsen. Du liest dir den Funktionsnamen und dann mit sscanf oder so die Parameter raus und guckst in einer std::map nach zu welchem string welche Funktion gehört. Diese rufst du mit den ausgelesenen Paramtern auf. Problem ist: Das ganze ist nicht sehr flexibel, da die Parameterzahl statisch und ihre Typen vorgegeben sind. Auch dafür könnte man sich Lösungen überlegen aber vielleicht reichen dir diese Anregungen erst einmal.
Lies dir etwas zu std::map und zu Funktionspointer durch!
-
Vielen Dank für die prompte Antwort, das mit dem Parsen ist mir klar und auch schon fertig, aber ich weiss nicht wie aus:
pthread_create(&thread,0,threadIt,(void*) "makeAudioCall|(int)4,(int)7,(string)/dev/ttyI0")
nachher makeAudioCall() aufrufe. Nehmen wir mal an das der string "makeAudioCall" in
string function;
gespeichert ist, wie zum Henker rufe ich dan die Funktion auf?
mit:
function (int[0],int[1],string[0]);
auf?
Gruss
-
Also einen Funktionspointer kannst du dir wie folgt definieren...
typedef void (*MyFunc)(int, int, std::string);
Du kannst nun eine std::map anlegen und deine Funktionen hinzufügen. Wenn du geparst hast suchst du dir mit dem Funktionsnamen die passende Funktion.
std::map<std::string, MyFunc> myfuncs; myfuncs["Test1"]=Test1; myfuncs["Test2"]=Test2; // So rufst du das in etwa auf wenn du den Namen rausgeparst hast myfuncs[strName](100, 299, "Hallo");
Hilft das?
-
typedef void (*funktion)(int, int, string); /* die aufzurufende funktion */ void makeAudioCall( int a, int b, string s ); /* speichert zum namen eine funktion */ map<string, funktion> m; /* nun muss du zu jedem namen eine funktion "setzen" */ m["makeAudioCall"] = makeAudioCall; /* in deiner threadfunktion * aufrufen der funktion f zu dem string s */ void* threadFunktion( void* v ) { int i1; int i2; string s; // name der funktion string x; // parsen von v i1, i2, x und s setzen ... // aufrufen der zu s gehoerenden funktion funktion f = m[s]; f( i1, i2, x ); // aufruf }
evtl. musst du noch pruefen, ob es zu einem namen eine
funktion in der map gibt, das geht mit find.
-
@entelchie: Mann tippst du langsam...
-
ja, ich weiss, aber ich bin auch nicht mehr der juengste...