std::string erkennen



  • Ich möchte eine Funktion schreiben welche es mir ermöglicht std::string in std::wstring umzuwandeln und umgekehrt.

    Meine Frage: Wie kann ich erkennen, ob mir ein string, oder ein wstring übergeben wurde? Man könnte natürlich mit typeid() auslesen und vergleichen, das ist mir aber dann doch zu doof.

    Grundgerüst:

    template <class StrOut, class StrIn>
    StrOut string_cast(const StrIn &in)
    {
    	// ...
    }
    


  • Warum sollte denn eine Funktion beides können?



  • Gegenfrage: Wieso denn nicht?

    Benutzung wäre dann so:

    std::wstring str = L"test";
    string_cast<std::string>(str);
    

    oder halt so:

    std::string str = "test";
    string_cast<std::wstring>(str);
    


  • Nutze Überladung statt eines "manuellen type-switches" und/oder finde einen generischen Weg, dein Funktionstemplate zu schreiben.

    Beispiel 1:

    template<class To, class From>
    To string_cast(From const& x)
    {
      To result (x.begin(),x.end());
      return result;
    }
    

    (Da ich mit mich char<->wchar Konvertierung nicht auskenne, gehe ich nicht davon aus, dass hier das richtige passiert).

    Beispiel 2:

    template<class T>
    inline void string_copy(T const& from, T & to) { to = from; }
    
    void string_copy(std::string const& s, std::wstring & t)
    {
      :::
    }
    
    void string_copy(std::wstring const& s, std::string & t)
    {
      :::
    }
    
    template<class To, class From>
    To string_cast(From const& x)
    {
      To result;
      string_copy(x,result);
      return result;
    }
    


  • Was spricht gegen das hier?

    std::wstring string_cast(const std::string &s);
    std::string string_cast(const std::wstring &ws);
    

    Damit würde jedenfalls dein Nutzungsbeispiel funktionieren, außer dass die <> wegfallen, und Probleme beim Auseinanderhalten gibts auch nicht.



  • Was bei euerer betrachtung komplett aussen vor bleibt, ist die Codierung !?
    Ist sich der TE so sicher, das fur jedes zeichen ein explizieter cast langt ?
    Muss / Soll selbst der widestring "nur" ASCII fähig sein ?

    "Normal" sollte man schon eine convertierungs- funktion oder bibliothek zu rate ziehen.

    Ciao ...



  • Ich bringe hier mal die beiden Konvertierungsfunktionen der WinAPI ins Spiel:
    MultiByteToWideChar/WideCharToMultiByte

    ->

    http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130%28v=vs.85%29.aspx



  • Danke erstmal für die Antworten.

    Ich bringe hier mal die beiden Konvertierungsfunktionen der WinAPI ins Spiel:
    MultiByteToWideChar/WideCharToMultiByte

    Ja die hatte ich auch schon gefunden. Wenn ich innerhalb einer Funktion herausfinden wollen würde um was für einen Typ es sich handelt könnte ich ja auch theoretisch beide Funktionen ausprobieren und immer den Rückgabetyp prüfen (Erfolg oder nicht).

    Was bei euerer betrachtung komplett aussen vor bleibt, ist die Codierung !?

    Stimmt, ich habe mir als Inspiration dafür diesen Code vorgenommen : http://www.c-plusplus.net/forum/p1197670#1197670

    Ich finde das ist hier sehr schön gelöst, ist halt nur in eine Richtung.

    Ich denke ich werde das jetzt erstmal mit Funktionsüberladung lösen, vielleicht fällt mir da später noch was besseres zu ein.


Anmelden zum Antworten