Gibt es eine Möglichkeit, std::setw
Manipulator (oder seine Funktion width
) dauerhaft einzustellen? Schauen Sie sich diese:"Permanent" 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;
}
Nach Lauf, ich sehe:
001 2 4 8 10 20 40 80 100
001 002 004 008 010 020 040 080 100
D.h. jeder Manipulator behält seinen Platz mit Ausnahme der setw
/width
, die für jeden Eintrag eingestellt werden muss. Gibt es eine elegante Möglichkeit, std::copy
(oder etwas anderes) zusammen mit setw
zu verwenden? Und mit elegant meine ich sicherlich nicht, einen eigenen Funktor oder eine Funktion zum Schreiben von Zeug in std::cout
zu erstellen.
Wirklich schönes Design, was ich denke, wäre anwendbar zu vielen Situationen. Es wäre ideal, wenn die Breite ein Laufzeit- (anstatt einer Kompilierzeit-) Parameter wäre, obwohl ich mir keine gute Möglichkeit vorstellen kann, diese Information in "ostream_iterator" zu bekommen. Sie könnten auch eine Hilfsfunktion bereitstellen: template mit_breite (T v) {return FixedWidthVal (v, width); } 'um zu sparen, muss der Typ angegeben werden. –
@j_random_hacker Nun, ich sollte Kredit geben, wo Kredit fällig ist. Ich habe diesen Ansatz von [einer Codereview-Frage] (http://codereview.stackexchange.com/q/18291/35254) übernommen und lediglich den Datentyp-Template-Parameter hinzugefügt. Netter Vorschlag für die Komfortfunktion. – chappjc