Czy istnieje sposób na stałe ustawić manipulator std::setw
(lub jego funkcję)? Spójrz na to:"Permanentny" std :: setw
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <iterator>
int main(void)
{
int array[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256 };
std::cout.fill('0');
std::cout.flags(std::ios::hex);
std::cout.width(3);
std::copy(&array[0], &array[9], std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
for(int i = 0; i < 9; i++)
{
std::cout.width(3);
std::cout << array[i] << " ";
}
std::cout << std::endl;
}
Po biegu, widzę:
001 2 4 8 10 20 40 80 100
001 002 004 008 010 020 040 080 100
Tj każdy manipulator ma swoje miejsce oprócz tego, które musi być ustawione dla każdego wpisu. Czy istnieje jakiś elegancki sposób korzystania z std::copy
(lub czegoś innego) wraz z setw
? A z elegancji na pewno nie mam na myśli tworzenia własnego funktora ani funkcji do pisania rzeczy na std::cout
.
Naprawdę ładny design, który myślę, że byłoby zastosowanie w wielu sytuacjach. Byłoby idealnie, gdyby szerokość była parametrem runtime (zamiast kompilacji), choć nie mogę wymyślić ładnego sposobu na uzyskanie tej informacji "w" 'ostream_iterator'. Można również podać funkcję wygody 'szablon with_width (T v) {return FixedWidthVal (v, szerokość); } ', aby zapisać, aby określić typ. –
@j_random_hacker Cóż, powinienem dać kredyt tam, gdzie należy się kredyt. Przyjąłem to podejście z [pytanie codereview] (http://codereview.stackexchange.com/q/18291/35254), jedynie dodając parametr szablonu typu danych. Ładna sugestia dla funkcji wygody. – chappjc