Funktion mit beliebiger Anzahl von Parametern erstellen ähnlich der Funktion "printf"
-
Hi!
Weiss einer von Euch wie man eine Funktion erstellt, die eine beliebige Anzahl von Argumenten als Parameter erhält? Z.B. ähnlich wie
int sprintf( char *buffer, const char *format [, argument] ... );
Wie greife ich dann auf diese Argumente zu?
Danke im voraus!
-
hi
du musst mit va_start und va_args arbeiten...
hier ein beispiel.. zwar msdn, aber zur ansicht
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_va_arg.2c_.va_end.2c_.va_start.asp
-
oder einen umweg über eine liste nehmen
-
Meinst Du so was?
#include <stdarg.h> template<class argType, class returnType> returnType VarArgs(returnType (*fnc)(argType) ,...) { returnType Value; va_list argptr; va_start (argptr,fnc); argType tmp; do { tmp=va_arg(argptr, argType); Value=(*fnc)(tmp); } while (*argptr!=0); return Value; }; int Sum(int value) { static int i=0; i+=value; return i; } int main(int argc, char* argv[]) { int i=VarArgs(Sum,10,20,30,5); //beliebig viele Werte return 0; }
Funktioniert unter MSVC 6.0 - aber keine Ahnung, ob das Standard-C++ ist...
-
VarArgs(concat, string("hallo"), string(" ") , string("welt"));
und jetzt erklär mir bitte, warum dein VarArgs keine gute Idee ist
-
keine Ahnung - mal davon abgesehe, daß "concat" Java ist...
#include <stdarg.h> #include <string> using namespace std; template<class argType, class returnType> returnType VarArgs(returnType (*fnc)(argType) ,...) { returnType Value; va_list argptr; va_start (argptr,fnc); do { Value=(*fnc)(va_arg(argptr, argType)); } while (*argptr!=0); return Value; }; string concat(string s) { static string str=""; str +=s; return str; }; int main(int argc, char* argv[]) { string tmp = VarArgs(concat, string("Hallo"), string(" "), string ("Welt")); return 0; }
Scheint zu funktionieren - wo ist der Haken?
-
Es wird eine flache Kopie erzeugt und kein CopyCtor aufgerufen.
Es mag durchaus manchmal funktionieren, aber irgendwann knallt es.aendere zB mal einen string in concat - dann wirst du sehen, was ich meine.
-
Es wird eine flache Kopie erzeugt und kein CopyCtor aufgerufen.
Es ist noch schlimmer, da das ganze auch noch unsymmetrisch ist.
Erst wird das Objekt beim Aufruf bitweise auf den Stack kopiert und dann wird es beim Aufruf von va_arg wieder per Copy-Ctor in ein Objekt kopiert.
Spätestens wenn ein Objekt eine nicht-triviale Copy-Semantik hat knallt es also.