"Permanente" std::setw
Gibt es eine Möglichkeit, wie Sie festlegen std::setw
manipulator (oder seine Funktion width
) dauerhaft? Schau mal hier:
#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 laufen, sehe ich:
001 2 4 8 10 20 40 80 100
001 002 004 008 010 020 040 080 100
I. e. jeder manipulator hält seinen Platz, außer die setw
/width
muss festgelegt werden, für jeden Eintrag. Gibt es eine elegante Möglichkeit, wie zu verwenden std::copy
(oder etwas anderes) zusammen mit setw
? Und durch elegant ich sicherlich nicht bedeuten, die Schaffung eigener Funktor oder eine Funktion für das schreiben von Zeug in std::cout
.
- Später, ähnliche Fragen: stackoverflow.com/questions/5328411/... und stackoverflow.com/questions/7248627/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, es ist nicht möglich. Keine Möglichkeit, es zu machen, rufen Sie
.width
jedes mal wieder. Aber kann man boost natürlich:Es hat erstellen Sie Ihre eigenen Funktor, aber es passiert hinter der Szene 🙂
Seit
setw
undwidth
nicht in eine beständige Einstellung, eine Lösung ist das definieren eines Typs, überschreibtoperator<<
Anwendungsetw
vor dem Wert. Dies würde es ermöglichen, eineostream_iterator
für diesen Typ Funktion mitstd::copy
als unten.Könnte man definieren: (1)
FixedWidthVal
als template-Klasse mit Parameter für den Datentyp (typename
) und Breite (Wert), und (2) eineoperator<<
für eineostream
und einFixedWidthVal
das giltsetw
für jede Einfügung.Dann könnte es angewendet werden, mit
std::copy
(oder einfor
Schleife):Ausgang (demo)
ostream_iterator
. Sie könnten auch eine Komfort-Funktiontemplate<typename T, int W> with_width(T v) { return FixedWidthVal<T>(v, width); }
zu ersparen, geben den Typ.