Arumentenliste für boost::format
-
Hallo,
ich habe bisher für Stringformatierung meistens vsprintf verwendet. Dort kann ich pratischerweise gleich die gesamte Argumentenliste als Argument für die Funktion mitgeben. Nun möchte ich auf Boost::format umsteigen, allerdings wirft er mir eine Exception (too_few_args). Wie kann ich diese Argumentenliste auch dafür nutzbar machen?
Beispiel:
void Format (char *strFormat, ...) { va_list argptr; va_start (argptr, strFormat); boost::format b_str (boost::format (strFormat) % argptr); va_end (argptr); std::string strBla = b_str.str(); // exception } main () { Format ("%s %d", "Hallo", 5); }
-
Hat den gar niemand eine Idee? So etwas wie boost::vformat habe ich nicht gefunden...
-
Das funktioniert so nicht, bei der variablen Argumentliste von Format gehen die Typinformationen verloren. Warum rufst du die boost::format-Funktion nicht direkt auf?
-
Badestrand schrieb:
Das funktioniert so nicht, bei der variablen Argumentliste von Format gehen die Typinformationen verloren.
Da hast du Recht. Die Exception wird zwar ausgelöst, da er den argptr als ein Argument ansieht und es dadurch natürlich zuwenig (falsche) Argumente gibt. Aber rein vom Prinzip her geht es wie du schon sagtest nicht.
Badestrand schrieb:
Warum rufst du die boost::format-Funktion nicht direkt auf?
Das war natürlich nur ein Beispiel. Bei mir müsste ich für jeden einzelnen Aufruf extra boost::format aufrufen und dann nochmal die Funktion. Naja vll. bleibe ich dann lieber beim C-Style, mal schauen...
-
Von der Ellipse solltest du in C++ weiten Abstand halten. Sobald du ein nicht-POD übergibst, wirds undefiniert.
Schau dir doch mal Boost.Preprocessor an. Damit kannst du ähnliches wie Boost.Format realisieren.
-
Wie soll Boost.Preprocessor da helfen? printf eine ist run-time, der Präprozessor compile-time.

-
Man kann mit Boost.Preprocessor Spezialisierungen oder ähnliches für fast beliebige Anzahl von Parametern erstellen. Damit kommt man an das printf-Verhalten schon recht nahe dran.