2012-06-08 11 views
7

Ich möchte kontrollieren, ob meine ostream Ausgabe von char s und unsigned char ‚s über << sie als Zeichen oder ganze Zahlen schreibt. Ich kann eine solche Option in der Standardbibliothek nicht finden. Jetzt habe ich wieder mit mehreren Überladungen auf eine Reihe von alternativen DruckfunktionenPrinting Zeichen als Integers

ostream& show(ostream& os, char s) { return os << static_cast<int>(s); } 
ostream& show(ostream& os, unsigned char s) { return os << static_cast<int>(s); } 

Ist es ein besserer Weg?

+1

Haben Sie immer Zeichen als ganze Zahlen ausgedruckt werden soll oder in Abhängigkeit von einem Zustand? – Andrey

+0

Ich möchte, dass es von einer Bedingung (Zustand) abhängig ist, die den Zustandsflags "ios" ähnlich ist. –

+4

Ich verstehe nicht die Notwendigkeit, zwischen signierten und unsignierten Zeichen zu unterscheiden. Wenn Sie es als Zahl ausgeben möchten, müssen Sie es zuerst als int interpretieren. Ansonsten drucke es einfach auf os. – Neil

Antwort

0

Ich habe einen Vorschlag basierend auf der Technik in how do I print an unsigned char as hex in c++ using ostream? verwendet.

template <typename Char> 
struct Formatter 
    { 
    Char c; 
    Formatter(Char _c) : c(_c) { } 

    bool PrintAsNumber() const 
    { 
    // implement your condition here 
    } 
    }; 

template <typename Char> 
std::ostream& operator<<(std::ostream& o, const Formatter<Char>& _fmt) 
    { 
    if (_fmt.PrintAsNumber()) 
    return (o << static_cast<int>(_fmt.c)); 
    else 
    return (o << _fmt.c); 
    } 

template <typename Char> 
Formatter<Char> fmt(Char _c) 
    { 
    return Formatter<Char>(_c); 
    } 

void Test() 
    { 
    char a = 66; 
    std::cout << fmt(a) << std::endl; 
    } 
+0

Dir ist natürlich klar, dass du 23 Codezeilen (ohne Tester) geschrieben hast, um ein Zeichen als Zahl ausdrucken zu können, oder? Ist das nicht ein bisschen übertrieben? – Neil

1

Nein, es gibt keinen besseren Weg. Ein besserer Weg wäre die Form eines benutzerdefinierten Streammanipulators wie std::hex. Dann können Sie Ihren ganzzahligen Ausdruck aus- und einschalten, ohne ihn für jede Zahl angeben zu müssen. Aber benutzerdefinierte Manipulatoren arbeiten mit dem Stream selbst, und es gibt keine zu tun, was Sie wollen. Ich nehme an, Sie könnten Ihren eigenen Stream schreiben, aber das ist viel mehr Arbeit als Sie jetzt tun.

Ehrlich gesagt, ist Ihre beste Wette zu sehen, ob Ihr Texteditor über Funktionen verfügt, um static_cast<int> einfacher zu schreiben. Ich nehme an, Sie würden es sonst viel tippen oder Sie würden nicht fragen. Auf diese Weise weiß jemand, der Ihren Code liest, genau, was Sie meinen (d. H. Ein Char als Integer ausgeben), ohne die Definition einer benutzerdefinierten Funktion nachschlagen zu müssen.

+0

+1 für eine Antwort, die Einfachheit begünstigt. – Neil

0

Nur ein Update auf einen alten Beitrag. Der eigentliche Trick ist die Verwendung von '+'. ZB:

template <typename T> 
void my_super_function(T x) 
{ 
    // ... 
    std::cout << +x << '\n'; // promotes x to a type printable as a number, regardless of type 
    // ... 
} 

In C++ 11 Sie tun können:

template <typename T> 
auto promote_to_printable_integer_type(T i) -> decltype(+i) 
{ 
    return +i; 
} 

Credit: How can I print a char as a number? How can I print a char* so the output shows the pointer’s numeric value?