Narzędzia użytkownika

Narzędzia witryny


format

To jest stara wersja strony!


Biblioteka Boost Format

Biblioteka Boost Format dostarcza klasę do formatowania argumentów zgodnie z dostarczonym łańcuchem formatującym. Podstawowe różnice w stosunku do funkcji printf, to m.in.:

  • deterministyczne zachowanie, nawet w przypadku podania błędnych argumentów (generuje wyjątek lub ignoruje błąd, w zależności od ustawień).
  • naturalne wsparcie typów zdefiniowanych przez użytkownika.
  • podawanie argumentów poprzez kolejne wywołania operatora %.

Podstawowe przykłady

Aby skorzystać z biblioteki Boost Format należy przede wszystkim dołączyć nagłówek boost/format.hpp. Nagłówek ten dostarcza nam do użycia klasę boost::format posiadającą cztery konstruktory:

format(const charT* str);
format(const charT* str, const std::locale & loc);
format(const string_t& s);
format(const string_t& s, const std::locale & loc);

Myślę, że komentarz tutaj jest zbędny. Jako pierwszy argument przekazujemy oczywiście łańcuch formatujący. Oto kilka najprostszych przykładów użycia:

#include <iostream>
#include <boost/format.hpp>
 
// (...)
 
boost::format frm("Abc %1% %2% %3% %4% cbA"); // Tworzymy nowy obiekt
frm % "A";                                    // Przypisujemy pierwszy argument
frm % "B" % "C" % "D";                        // Kolejne argumenty przypisujemy za jednym zamachem
std::cout << frm << std::endl;                // --> "Abc A B C D cbA"

Wszystkie operacje możemy oczywiście wykonać w jednej linii. Liczba argumentów przekazywanych do obiektu jest dowolna, a każdy argument może wystąpić w przekazywanym łańcuchu dowolną ilość razy.

std::cout << boost::format("%1% %2% %1%") % "A" % "B" << std::endl;  // --> "A B A"

Sformatowany string możemy także pobrać do zmiennej:

std::string s = frm.str();         // Odpowiednia liczba argumentów musi być uprzednio przekazana do obiektu
std::string s2 = boost::str(frm); 

Tego samego obiektu format możemy użyć ile razy chcemy, dostarczając nowego zestawu argumentów.

boost::format frm("%% _%1%_ _%2%_ _%3%_ %%");  // Podwójne użycie znaku specjalnego % spowoduje jego wypisanie na ekran
frm % "A" % 2.32 % 10;
std::cout << frm << std::endl;                 // --> "% _A_ _2.32_ _10_ %" 
frm % "Foo" % 2 % "Bar";
std::cout << frm << std::endl;                 // --> "% _Foo_ _2_ _Bar_ %"

Formatowanie argumentów

Na wstępie należałoby zaznaczyć, że argumenty w łańcuchu formatującym mogą być definiowane na trzy różne sposoby:

  1. Odziedziczony po funkcji printf format: %spec
  2. %|spec| z nawiasami użytymi w celu dopuszczenia parametry type-char jako opcjonalny
  3. %N% - prosty, przejrzysty sposób bez żadnego formatowania.

gdzie spec ma następującą składnie:

[ N$ ] [ flags ] [ width ] [ .precision ] type-char

Argumenty ujęte w nawiasy kwadratowe są opcjonalne, a dla typu drugiego (%|spec|) również type-char.

Argument [ N$ ]

W jednym łańcuchu możemy korzystać z różnych sposóbów, natomiast błędem jest użycie zarówno argumentów numerowanych, jak i nienumerowanych.

std::cout << boost::format("%d %s") % 10 % "foo" << std::endl;       // OK
std::cout << boost::format("%1$s %2$s") % "foo" % "bar" << std::endl;  // OK
std::cout << boost::format("%1$d %s") % 10 % "bar" << std::endl;      // BŁĄD!

Ciekawe przykłady użycia

format.1208291040.txt.gz · ostatnio zmienione: 2008/04/15 22:24 przez piechot