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 geklapptEs 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
-
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::wstringmacht man so:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-168607.htmlGrüssli
-
Hm,
das hierhelper::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
-
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, sattwiden. 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