void by call

09/01/2014 20:24 Terrat#1
Hey gibt es ne möglichkeit ne void auf zu rufen über einen String?

In autoit ist es call()
09/01/2014 21:10 Jeoni#2
Ich vermute einfach mal, dass du mit "void" eine Funktion oder einen Funktionspointer meinst, da es sonst wenig Sinn macht. Ferner nehme ich einfach mal C++ und nicht C an. Mit C ist das auch möglich, aber halt über Umwege und nicht so "schön", wie mit C++.
Standardmäßig gibt es eigentlich keine Information im Kompilat darüber, wie eine Funktion heißt, wenn sie nicht gerade exportiert wird.
Aber du könntest dieses Feature quasi selbst einzubauen, indem du beispielsweise eine std::map benutzt, welche den Funktionsnamen mit einem Pointer zu der Funktion verknüpft.
Sieht ca. so aus (könnte ggf. Fehler enthalten, hab den Code nur aus dem Kopf geschrieben und nicht getestet):
Code:
// functions
void PrintA() { std::cout << "A" << std::endl; }
void PrintB() { std::cout << "B" << std::endl; }
void PrintC() { std::cout << "C" << std::endl; }

std::map<std::string, void(*)()> functions{ {"FuncA", &PrintA}, {"FuncB", &PrintB}, {"C", &PrintC} };
...
std::string userInput;
// let user choose string
// make sure user enters a valid string ("A", "B" or "C") by checking with functions.find
functions[userInput](); // call functions
Wichtig ist, dass die Funktionen, die du in die Map tust eine einheitliche Signatur haben. Genauer gesagt wenigstens eine, die man einheitlich aufrufen kann, ohne das Programm zum Crash zu führen.
Die Map könnte natürlich auch zur Laufzeit noch verändert werden oder so, muss aber natürlich nicht. In letzterem Fall könnte man sie auch gleich const setzen.
Generell solltest du aber erstmal schauen, ob du's WIRKLICH brauchst, eine Funktion anhand ihres Namens aufzurufen und ob nicht vielleicht ein einfacher Funktionspointer, den man vielleicht zur Laufzeit ändert oder dergleichen, ausreicht.
Hoffe, ich konnte dir helfen ;)
Jeoni
09/01/2014 22:26 snow#3
@Jeoni: Würde eher std::function<void()> verwenden, Funktionszeiger werden dann impliziert konvertiert.

@Dreamsläps dynamisch (wie vermutlich bei AutoIt) wird das nicht gehen, die Informationen müssen beim Kompilieren vorliegen. Wenn es um dein Projekt geht: erwarte einfach ein Funktionsobjekt, an das du Nachrichten sendest.
09/02/2014 17:38 Terrat#4
Nein es geht mir darum:
Ich habe eine DLL mit der funktion CALL_VOID
Und der über dir hat mir genau das gegeben was ich gebraucht hab danke :)
Kann geclosed werden