boost lexical cast macht mit wstring probleme



  • Ne lib verwendet anstatt std::string std::wstring.

    Ich muss an einer stelle einen wstring in einen string casten, dafür wollte ich nen lexical cast nutzen. Meine Lib ist 1.36.0 (ich update grade auf 1.37.0)

    Der simple code
    http://codepad.org/MBqPhhaL
    Anstatt wfoo hat wfoo.c_str() auch nicht geklappt

    Es kommt eine Fehlermeldung, wenn auch eine andere, als die bei codepad (welche ich nicht posten kann, weil ich boost update und kein lexical cast mehr habe)

    Ist dies generell ein problem ? In die andere Richtung ist es eigentlich kein Thema, aber von wstring nach string klappts nicht


  • Administrator

    Dafür ist Lexical Cast nicht gedacht, daher wird das nie funktionieren. Da müsstest du ziemlich hässliche Workarounds bauen, also unsinnig.

    std::string <-> std::wstring macht man so:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-168607.html

    Grüssli



  • Hm,
    das hier

    helper::Widen<char> toString;
    	std::wstring wfoo = L"Foooo";
    	std::string foo = toString(wfoo);
    

    Ist nicht so erfolgreich

    Error 1 error C2664: 'std::basic_string<_Elem,_Traits,_Ax> helper::Widen<E>::operator ()(const std::string &) const' : cannot convert parameter 1 from 'const wchar_t *' to 'const std::string &' d:\writer.cpp 1266

    Mir geht es ja um wstring2string


  • Administrator

    Seikilos schrieb:

    Mir geht es ja um wstring2string

    Sorry, dachte im Thread würde dazu auch was stehen.

    Grundsätzlich geht es in die andere Richtung, mit der Funktion narrow , satt widen . Allerdings muss ich gestehen, dass es bei mir gerade nicht so korrekt funktioniert hat und habe das schon länger nicht mehr gemacht.

    Es geht aber irgendwie so:

    #include <locale>
    #include <string>
    #include <vector>
    
    // ...
    
    std::string narrow(std::wstring const& wstr,
    				   char defaultChar = ' ',
    				   std::locale const& locale = std::locale())
    {
    	std::wstring::size_type srcSize = wstr.size();
    	wchar_t const* src = wstr.c_str();
    
    	std::vector<char> buffer(srcSize);
    
    	std::ctype<wchar_t> const& ctype
    		= std::use_facet<std::ctype<wchar_t> >(locale);
    
    	ctype.narrow(src, src + srcSize,
    				 defaultChar,
    				 &buffer[0]);
    
    	return std::string(buffer.begin(), buffer.end());
    }
    

    Grüssli


Anmelden zum Antworten