Funktion mit variabler Anzahl Argumente aufrufen.
-
Hi zusammen,
ich bin es schon wieder. Dieses Mal kann ich meine Frage wohl auch etwas kürzer fassen.

Ich habe die Funktion execl(), welche eine variable Anzahl an Argumenten akzeptiert und einen Vektor, der alle Argumente enthält. Wie kann ich nun am elegantesten execl() aufrufen, wenn ich zur Compilezeit noch nicht weiß, wieviele Einträge in meinem Vektor stehen.
Die elegantest Möglichkeit, die mir einfällt ist die folgende:
std::string path, name; std::vector<std::string> options; ... switch (options.size()) { case 0: execl(path, name, NULL); break; case 1: execl(path, name, options[0], NULL); break; case 2: execl(path, name, options[0], options[1], NULL); break; ... case n: execl(path, name, options[0], options[1], ..., options[n], NULL); break; default: throw my_exception(); }Das Problem hierbei ist, dass ich mir auf eine maximal Anzahl Parameter n festlegen müsste. Das ist zwar gangbar, lieber wäre es mir aber, wenn ich mich da nicht einschränken müsste.
Vielleicht hat einer von euch eine Idee.
Gruß
Paul
-
Ist
execl()eine Funktion mit Ellipse (...)? Dann kannst du das sowieso gleich vergessen, da das Übergeben von Nicht-PODs (dazu gehörtstd::string) an C-VarArg-Funktionen undefiniertes Verhalten ist. Anders siehts aus, wenn es sich um Variadic Templates handelt.Wie sieht die Signatur von
execl()aus?
-
wenn die parameter shcon in einemv ector stehen, wieso übergibst du dann nicht diesen vector?!?
vielleicht noch 2 indexe als bereichs begrenzung (wobei man dann direkt iteratoren übergeben könnte)...
-
Warum nimmst du nicht execv? Den Vector musst du natürlich trotzdem umkopieren, da Funktionen auf Betriebssystemebene keinen std::string kennen.
-
Danke für die vielen schnellen Antworten. execv sieht nach einer Lösung aus. Das werde ich gleich mal probieren.
Ansonsten muss es natürlich immer options[0].c_str() heißen, das ist richtig. Schande über mein Haupt.

Die Signaturen der execX-Funktionen stehen zum Beispiel auf http://linux.die.net/man/3/exec.
Da das Ganze aber ja ein recht allgemeines Problem ist, würde es mich nach wie vor noch interessieren, ob es eine elegantere Möglichkeit gibt, als die von mir unten genannte. Es gibt ja nicht für jede Funktion eine zweite Variante, die auch einen Vektor akzepiert. Oder ist das Problem tatsächlich weniger praxisrelevant, als ich gerade denke?