Frage

Hintergrund:

I haben template Strom-Operatoren (z.B. operator << (ostream &, std::vector <T>)) (das Ausgangscontainerelemente, die möglicherweise von einigen 8-Bit-Integer-Typ sein kann, (z.B. unsigned char, int_least8_t, et cetera).

Problem:

Der Standardwert ist, dass diese Art ausgegeben als char (ASCII). Ich habe nur char (oder wchar_t oder was auch immer) für ASCII-Variablen, nie unsigned / signed-Typen verwendet. Wie bekomme ich diese 8-Bit-Typen immer ausgegeben als signed int / unsigned int (Zahlen) sein statt, auch wenn der Anrufer nicht den Typen nicht kennt?

Zuerst versucht:

Ich habe versucht (mit GCC) zum Beispiel der Definition operator << (ostream &, unsigned char) mit einer Besetzung in ihm (das heißt stream << static_cast <int> (value). Das funktioniert für unsigned char Werte, aber dann uint8_t werde noch ausgegeben als char.

Der gleiche zugrunde liegende Typ (d.h. unsigned/signed char nicht in Überlastungen verwendet werden kann, so dass ich nicht eine Überlast von beispielsweise operator << (ostream &, int_fast8_t) definieren kann.

War es hilfreich?

Lösung

Eine Möglichkeit, dass in den Sinn kommt, ist Typ Züge mit den Ausgabetyp für jeden Typ zu definieren. Sie müssten, dass von Hand für jede Art erklären. Die Züge als Vorlage Struktur definiert werden, die für jeden Datentyp spezialisiert, die einen anderen Ausgabe-Typen als die Daten-Typ selbst hat:

template< T >
struct output_trait {
    typedef const T & output_type;
}

In Ihrem Netzbetreiber schreiben Sie:

std::cout << static_cast< output_trait< T >::output_type >( variable ) << std::endl;

Dies wird keine Besetzung standardmäßig, aber für Typen, für die output_trait spezialisiert ist, wird es eine Besetzung tun:

template<>
struct output_trait< unsigned char > {
    typedef unsigned int output_type;
}

Andere Tipps

Du verwechselst die eigentlichen Daten in einer Variablen gehalten, mit dem, was Darstellung, die Sie wählen, um es für den Druck.

Denken Sie daran, auf diese Weise: chars, ints, doubles, longs, Was immer, sie sind alle nur Stücke von Speicher für Sie speichern Zahlen in A char eine Zahl zwischen 0 und 255 (oder -128 und 127). -. Sie können wählen, um es als ASCII-Zeichen darzustellen, oder als Zahl oder als Stern am Himmel mit Hilfe von OpenGL

Wenn Sie die Zahl hinter dem Zeichen ‚a‘ sehen wollen, nur anweisen, Ihr Programm, dass Teil des Speichers zu behandeln (das für Sie enthält ein ‚a‘) als eine Nummer. Verwenden Sie wirft. Hier:

http://www.cplusplus.com/doc/tutorial/typecasting/

sehen, ob das hilft!

Sie können einfach werfen:

#include<iostream>

int main()
{
 uint8_t blah = 65;
 std::cout << static_cast<int>(blah) << "\n";
 return 0;
}
  

65

Wenn ich Sie richtig verstanden .. Ausgabe, die es wie folgt aus:

std::cout << ( unsigned int )char << '\n';

oder mehr C ++ Stil - Verwendung static_cast, zum Beispiel:

int main()
{
    char a = 'a';
    char b = 97;
    std::cout << static_cast< unsigned int >( a ) << '\n';
    std::cout << static_cast< unsigned int >( b ) << '\n';
    return 0;
}

beide std::cout den gleichen Druck: Der erste - der ASCII-Code von 'a': 97, die zweite - nur der Wert 97, gespeichert in b. Sowohl a und b, sind absolut gleich.

Sie können sie werfen, bevor Sie ausgeben:

std::cout << (unsigned int) container[index];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top