Erweiterten Char in basic_string<>?



  • Hallo,

    ich vermute mal, meine Frage wir mit "NEIN" beantwortet, aber mit C++11 könnte es ja was geben, das ich nicht kennen, bzw. vielleicht hat ja irgendwer einen Stubs in die richtige Richtung....

    Mein Problem:
    Ich muss Strings verarbeiten. Und oftmals wird einfach von meinem String die Funktion c_str() benötigt. Was auch gerade in meiner Schnittstelle nach Netzwerk recht praktisch ist.
    ABER: Ich müsste mir für jeden Buchstaben einfach ein paar "Attribute" merken. Das würde anhand von Zahlen recht einfach gehen als zu jedem Buchstaben ein paar uInts speichern. Attribute im Klassischen Sinn wären ja "Fett" oder "Kuriv". So etwas ähnliches habe ich auch, nur dass das keine sichtbaren Attribute sind, sondern eher was wie "Lack" und "Duft" (man merkt, es geht um eine Druckerei).

    Jetzt kann ich ja in dem Template basic_string<> eigentlich nur nur char, wchar_t oder vergleichbares verwenden.

    Schön wäre jetzt ein

    class StefanWChar public wchar_t
    {};
    typedef basic_string<StefanWChar> StefanString;
    

    Natürlich habe ich schon geschaut und getestet. Und natürlich bin ich an Settern und Gettern gescheitert, weil ein wchar_t ja ein einfacher Datentyp ist.

    Frage
    Wie speichert man denn am sinnvollstenten Strings mit Attributen. Ich meine es müsste ja mehrere Ansätze geben, da ja z.B. auch Rich-Text-Formate für Fett und Kursiv unterwegs sind. Und um jetzt nicht ein komplett neuen Toolset an Klassen entwerfen zu müssen wäre es richtig gut, wenn die Basis-Klasse ein basic_string<> wäre. Denn dafür habe ich natürlich schon sehr viele Klassen und Templates, die damit arbeiten.

    Idee 1
    vector in basic_string<>
    ersten Zeichen ist das echte Zeichen, alle anderen die Attribute

    Idee 2
    Eine Liste mit "Anzahl-Angeber"

    3,a,7,9,2,b,3
    ^ ^ ^ ^ ^ ^ ^- Attribut "3" zu "b"
    | | | | | +--- Zeichen "b"
    | | | | +----- Anzahl-Angeber (Die nächten 2 gehören zusammen)
    | | | +------- Attribut "9" zu "a"
    | | +--------- Attribut "7" zu "a"
    | +----------- Zeichen "a"
    +------------- Anzahl-Angeber (Die nächten 3 gehören zusammen)
    

    Und
    Natürlich wäre ich auch für andere Ideen dankbar. Das hier ist jetzt nur der erste Gedankengang. Heisst nicht, dass der Sinnvoll ist.
    Danke.



  • Hallo,

    damit so etwas wie mit deiner eigenen Char-Klasse funktioniert musst du auch Char-Traits dafür bereitstellen (zweiter Templateparameter von std::basic_string ).

    In der Praxix löst man dein Problem jedoch nicht mit speziellen Zeichen sondern mit einem System aus Tags. Vielleicht möchtest du dir mal RTF und HTML anschauen.



  • asfdlol schrieb:

    Hallo,

    Hallo.

    asfdlol schrieb:

    damit so etwas wie mit deiner eigenen Char-Klasse funktioniert musst du auch Char-Traits dafür bereitstellen (zweiter Templateparameter von std::basic_string ).

    Danke, das ist es was ich gesucht habe.

    asfdlol schrieb:

    In der Praxix löst man dein Problem jedoch nicht mit speziellen Zeichen sondern mit einem System aus Tags. Vielleicht möchtest du dir mal RTF und HTML anschauen.

    Ja, XML und RTF kenne ich durchaus. Derzeit habe ich es mit XML gelöst. Allerdings geht es weniger um Sequenzen die gespeichert werden (dann wären Tags die absolut sinnvolle Wahl), es geht mehr um Steuerungsbefehle und einem EXTREM kleinen Speicherplatz (wodurch der Overhead durch XML-Syntax schon zum Problem werden kann, zumindest am externen System).



  • Ich wuerde eigene Zeichensequenzen dafuer definieren. Wenn du z.B. fetten Text hast, nimm dafuer &b (fuer Bold), fuer kursiv z.B. &i (italic). Will man ein richtiges &-Zeichen, benutzt man "&&". Dann noch ein Reset-Symbol, z.B. &r. Und Farben kannste auch einbauen. &#123456


Log in to reply