2012-11-28 6 views
5

Wie kapitalisieren Sie die Ausgabe, die durch das cout von booleschen Werten erzeugt wird.boolalpha capitalize

Ich weiß, dass wenn ich es täte:

cout << boolalpha << true;

wird es Ausgabe

true

wie bekomme ich es zur Ausgabe

True

Ich habe das Gefühl, dass es mit do_truename und do_falsename zu tun hat, aber ich habe keine Ahnung, wie es geht.

+2

Haben Sie schon einmal darüber nachgedacht, nur so etwas wie 'cout tun << (true„True“:„False“) '? –

+0

Sie müssen sagen, wie oft Sie so etwas verwenden werden. Wenn Sie es einmal brauchen - Rat von Kevin Ballard oder versuchen zu verstehen, C++ Facet-System http://stdcxx.apache.org/doc/stdlibug/25-5.html http://msdn.microsoft.com/ de-de/library/0z120te3.aspx http://www.cplusplus.com/reference/locale/numpunct/truename/ –

+0

ja, aber ich will das nicht überall machen, ich habe einen boolean, manchmal möchte ich do 'cout << function (" foo ");' wobei function einen booleschen Wert zurückgibt und ich keine Ahnung habe, welche überladene Funktion verwendet wird. – Gideon

Antwort

6

Für einen flüchtigen Moment dachte ich, dass dies mit std::uppercase getan werden könnte, aber das scheint nicht der Fall zu sein: diese gelten nur für Dinge wie die Hexadezimalziffern und den Exponenten. Also, es scheint es in der Tat erfordert eine std::numpunct<char> Überschreibung, die allerdings nicht so schlimm:

#include <iostream> 
#include <locale> 

struct numpunct 
    : std::numpunct<char> 
{ 
    std::string do_truename() const { return "True"; } 
    std::string do_falsename() const { return "False"; } 
}; 

int main() 
{ 
    std::locale loc(std::cout.getloc(), new numpunct); 
    std::cout.imbue(loc); 
    std::cout << std::boolalpha << true << "\n"; 
} 
+1

Frage: Was passiert mit dem Objekt, das in' new numpunct' erstellt wurde? Wird die Zuweisung aufgehoben, wird das neue Locale-Objekt nicht mehr unterstützt? – jogojapan

+0

Danke! Das hat den Trick gemacht. – Gideon

+4

@jogojapan: Ich versuche Code richtig zu schreiben. Also, ja, das Objekt wird implizit als Referenz gezählt und es wird zerstört, wenn das letzte 'std :: locale', das darauf verweist, den Gültigkeitsbereich verlässt. Da die Pflege von 'std :: locale'-Objekten etwas implizit ist und sie an ziemlich vielen Stellen enden, wurde angenommen, dass das Objekt automatisch gepflegt werden muss. Da es kein "std :: shared_ptr " gab, wird ein benutzerdefiniertes Referenzzählschema verwendet. –

Verwandte Themen