JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=f3e1fbcc1c2aa12080684a8959d67a54Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

char cast

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> FAQ
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 24.02.2007, 21:32    Titel: char cast Antworten mit Zitat

Von GreveN:

Da ich denke, dass dieser leider nur sehr begrenzt einsetzbar ist (WinAPI), man aber leider auch des Öfteren einen entsprechenden Cast brauchen würde, wegen mangelnden Unicode-Supports in diversen Bibliotheken etc., hab' ich mich mal selber an die Lösung des Problems gemacht. Vorweg: Ich benutze die 'codecvt'-Facette, welche eigentlich für Zeichenkonvertierung gedacht ist, bewusst nicht, da mir die Handhabung... naja, etwas barbarisch erscheint und ich keinen erkennbaren Vorteil gegenüber der 'widen'- bzw. 'narrow'-Methode sehe, wenn da jemand mehr wissen sollte als ich, so bitte ich um Aufklärung... Wink

So, hier der eigentliche Cast:
CPP:
#include <locale>
#include <string>


template<class dest_type, class source_type>
inline const std::basic_string<dest_type> char_cast(const std::basic_string<source_type>& source, const std::locale& loc = std::locale::classic());


template<>
inline const std::basic_string<char> char_cast(const std::basic_string<char>& source, const std::locale& loc)
{ return source; }


template<>
inline const std::basic_string<wchar_t> char_cast(const std::basic_string<wchar_t>& source, const std::locale& loc)
{ return source; }


template<>
inline const std::basic_string<wchar_t> char_cast(const std::basic_string<char>& source, const std::locale& loc)
{
    wchar_t* const buf = new wchar_t[source.length()+1];

    std::use_facet<std::ctype<wchar_t> >(loc).widen(source.data(), &source.data()[source.length()], buf);
    buf[source.length()] = 0;
    const std::basic_string<wchar_t> ret_str(buf);

    delete[] buf;

    return ret_str;
}


template<>
inline const std::basic_string<char> char_cast(const std::basic_string<wchar_t>& source, const std::locale& loc)
{
    char* const buf = new char[source.length()+1];

    std::use_facet<std::ctype<wchar_t> >(loc).narrow(source.data(), &source.data()[source.length()], '*', buf);
    buf[source.length()] = 0;
    const std::basic_string<char> ret_str(buf);

    delete[] buf;

    return ret_str;
}


Also soviel zusagen gibt's ja eigentlich nicht, besonders wichtig war mir noch, voll kompatibel zu allen erdenklichen Zeichensätzen, regionalen Besonderheien etc. zusein, deshalb ist es möglich als 2. Parameter dem Cast ein Locale mit auf den Weg zu geben, ansonsten wird das gesetzte Standardlocale verwendet, ich verwende die 'ctype'-Facette eben dieses Locales, die 2 herrliche Methoden ('widen' und 'narrow') zur Verfügung stellt.
Sooo... soll eigentlich nur eine Denkanregung sein, wie man es imho besser machen kann, wer mag kann natürlich die 'codecvt'-Facette, Standard-C-Strings und vielleicht sogar einen 3. Parameter für die Konvertierung von 'wchar_t' zu 'char' für das Defaultzeichen verwenden.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> FAQ Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum