Javas byte in C++(11) - ein char-Wrapper



  • Sollte das nicht per manipulator lösbar sein?



  • Das ist mit static_cast<int> lösbar.



  • Bashar schrieb:

    Leider doch. 27.6.1.2.3§10, 27.6.2.5.4 (C++98)

    Dann dürfte das hier doch eigentlich nicht kompilieren, oder? http://ideone.com/aU6po



  • Wieso sollte das nicht kompilieren? Das tut genau das, was es laut Standard soll (char, signed char und unsigned char sind verschiedene Typen)...



  • Mehrfachdefinition und so...



  • Wo siehst du da eine Mehrfachdefinition? Deine operator << liegen im global Namespace...



  • Kellerautomat schrieb:

    Ich glaube, die sind laut Standard nicht definiert.

    ->

    Bashar schrieb:

    Leider doch. 27.6.1.2.3§10, 27.6.2.5.4 (C++98)



  • Die sind aber im namespace std...



  • Na dann. Wo ist dann das Problem? Operatoren überladen und fertich.


  • Mod

    dot schrieb:

    Die sind aber im namespace std...

    Die Streamklassen auch...



  • ODR ist kein Problem eben wegen std:: vs. ::.

    Es "dürfte" nicht kompilieren, weil der std::operator << über ODL gefunden wird, und es daher ambiguous sein sollte.

    Es kompiliert trotzdem, weil der std::operator << ein Template ist, und bei der Overload-Resolution non-Template gegenüber Template vorgezogen wird.

    Sobald man die eigenen Operatoren auch zu Templates macht schnalzt es auch wie erwartet:

    http://ideone.com/jz6ik

    Kellerautomat schrieb:

    Na dann. Wo ist dann das Problem? Operatoren überladen und fertich.

    Ich sehe es schoh als Problem, wenn es in der Standard-Library einen passenden Operator gibt, der gefunden wird, aber nicht das tut was man will.
    Dadurch hast du nämlich keine Möglichkeit dahinterzukommen, wenn irgendwo Code kompiliert wird, der die eigenen Operatoren nicht "sieht" - weil das entsprechende File nicht inkludiert wurde. Der Compiler meldet nix, das Ergebnis ist aber falsch.

    Alles bäh.



  • Man hätte von Anfang an Zeichentypen und Integertypen etwas separieren sollen.
    char ist die Kurzform für Charakter oder? Wieso speichere ich kleine Zahlen als "Zeichen"? Was wäre, wenn ein exotischer Rechner existieren würde, der Zeichen aus irgendwie nicht numerisch Speichert, sondern zb spezielle Zeichenregister hat?

    Man hätte ja zb einem Typen small einführen können. wchar_t nutzt ja auch niemand als Integerersatz.



  • Ethon schrieb:

    Man hätte von Anfang an Zeichentypen und Integertypen etwas separieren sollen.

    Das "Problem" was wir hier haben betrifft lediglich die Implementierung der stream Klassen und sonst nichts.

    Mit boost::format oder printf, etc. gibt es dieses "Problem" garnicht.
    Und auch die stream Klassen bieten eine Loesung dafuer an: iomanip



  • Ich verstehe trotzdem nicht, wieso man kleine Zahlen als "Zeichen" speichert.



  • Ethon schrieb:

    Ich verstehe trotzdem nicht, wieso man kleine Zahlen als "Zeichen" speichert.

    Tut man das!?



  • dot schrieb:

    Ethon schrieb:

    Ich verstehe trotzdem nicht, wieso man kleine Zahlen als "Zeichen" speichert.

    Tut man das!?

    Ein Character ist ein Zeichen oder etwa nicht?
    Meiner Meinung nach nutzt man Implementierungdetails aus, wenn man einen char für etwas anderen nutzt.



  • Ethon schrieb:

    dot schrieb:

    Ethon schrieb:

    Ich verstehe trotzdem nicht, wieso man kleine Zahlen als "Zeichen" speichert.

    Tut man das!?

    Ein Character ist ein Zeichen oder etwa nicht?
    Meiner Meinung nach nutzt man Implementierungdetails aus, wenn man einen char für etwas anderen nutzt.

    Nein, das ist falsch. Ein char ist einfach ein Byte. Oft ist es praktisch dieses Byte als Buchstabe zu interpretieren, wie es zB die io stream library macht - aber das macht nur die io stream library.

    wenn ich ein
    cout<< format("%d") % 'a';
    mache, bekomme ich eine Zahl als Ergebnis.

    Es ist einfach nur oft praktisch wenn man cout<<'a'; macht, dass ein a ausgegeben wird - deshalb ist das bei der iostream library der Fall. Es hindert dich aber nichts daran eine Library zu schreiben wo das nicht der Fall ist.



  • Ethon schrieb:

    dot schrieb:

    Ethon schrieb:

    Ich verstehe trotzdem nicht, wieso man kleine Zahlen als "Zeichen" speichert.

    Tut man das!?

    Ein Character ist ein Zeichen oder etwa nicht?

    Ja, "Character" bedeutet "Zeichen", aber ein char ist ein integer...



  • Ethon schrieb:

    Man hätte von Anfang an Zeichentypen und Integertypen etwas separieren sollen.
    char ist die Kurzform für Charakter oder? Wieso speichere ich kleine Zahlen als "Zeichen"? Was wäre, wenn ein exotischer Rechner existieren würde, der Zeichen aus irgendwie nicht numerisch Speichert, sondern zb spezielle Zeichenregister hat?

    Man hätte ja zb einem Typen small einführen können. wchar_t nutzt ja auch niemand als Integerersatz.

    Genau dafür hätte man ja die (befremdliche) Trennung char/signed char/unsigned char verwenden können (sind ja bekanntlich 3 verschiedene Typen, im Gegensatz zu short/int/long/long long wo es nur je 2 verschiedene Typen gibt).
    Dann hätte die "Dreiteilung" nämlich einen Sinn: signed char und unsigned char werden als Zahl interpretiert, und char als Zeichen.

    Würde mich mal interessieren warum das nicht gemacht wurde. Kann mir nämlich grad keinen wirklich guten Grund vorstellen.



  • hustbaer schrieb:

    Würde mich mal interessieren warum das nicht gemacht wurde. Kann mir nämlich grad keinen wirklich guten Grund vorstellen.

    Weil es Aufwand ist der nichts bringt.

    Natuerlich waere es technisch feiner wenn es so waere - aber in der Praxis ist das kein Thema. Deshalb findet sich vermutlich auch niemand der dafuer ordentliche vorschlaege unterbreitet.


Anmelden zum Antworten