unbekannte argumente benutzen
-
heiho
es gibt ja in cpp die moeglichkeit "..." zu benutzen zb
int ret = sprintf_s(Val, iReserved, rhs.c_str(), ...);aaaaber
ich hab hier eine template funktion in welcher ich diese argumente verwenden willtemplate<class T> void foo<T>::bar(std::string rhs, ...) { . . . int ret = sprintf_s(Val, iReserved, rhs.c_str(), ...); . . . }compiliert auch problemlos, aber sobald ich es benutzen will:
dings.bar("abba %d", 15);kommt der fehler:
error C2059: syntax error : '...'bjarne schrieb das die ... einfach eine unbekannte anzahl parameter ist welche keine typpruefung ermoeglichen
aber wie kann ich diese selber benutzen?
-
Um variable Argumente verarbeiten zu können, gibt es den Typ 'va_list' und die Makros/Funktionen 'va_start()', 'va_arg()' und 'va_end()'. (wieviele und was für Parameter du bekommst, mußt du allerdings selber wissen)
Für dich hilfreich ist sicher noch vsprintf() - das nimmt anstelle von beliebig vielen Argumenten einen va_list, den du vorbereitet haben mußt.
-
In diesem Fall: garnicht.
Es gibt aber die Möglichkeit einer Funktion ein Handle (va_list) auf die unbestimmte Argumentliste zu übergeben. Zu Deiner Funktion sprintf_s gibt es dazu das Pendant vsprintf_s, welches statt der unbestimmten Argumentliste eben jenes Handle auf eben jene Liste erwartet. Damit kannst Du Deine Funktion realisieren:
template<class T> void foo<T>::bar(std::string rhs, ...) { . . . va_list ap; va_start(ap, rhs); int ret = vsprintf_s(Val, iReserved, rhs.c_str(), ap); va_end(ap); . . . }Generell würde ich aber empfehlen, "..." garnicht mehr zu benutzen, da es nicht nur die Typunsicherheit aus C-Zeiten erbt, sondern zusätzlich die Anzahl der Argumente nicht ermittelt werden kann.
-
aaaaaaah - vielen dank dafuer, ich hatte noch sowas im hinterkopf - danke