Konwersja wchar_t na basic_string

0

Znacie jakiś szybki sposób na konwersję jak w temacie?
Mam fragment kodu:

wchar_t wpom[30];
mbtowc(wpom, "olaboga", 10);

ati_dom::DOMString w = wpom;

Błąd wywala na ostatniej linijce (Cannot convert from 'wchar_t[30]' to 'basic_string<_Elem>').

Próbowałam kombinować o tak:

wchar_t wpom[30];
mbtowc(wpom, "olaboga", 10);

std::basic_string<wchar_t> basic_wpom(wpom);
ati_dom::DOMString w = basic_wpom;

Ale jedyne co mi to dało to: Cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'std::basic_string<_Elem>'

0

Cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'std::basic_string<_Elem>' wywala ci w linijce ati_dom::DOMString w = basic_wpom;?

Bez kombinowania to pętla :/

0

@up, tak, na tej linijce.

Bez kombinowania to pętla

Jak powinna wyglądać taka pętla? Przyznam, że naprawdę nie cierpię operacji na znakach w C++, właśnie przez takie pierdoły co chwilę. Myślałam, że jak stworze zmienną typu basic_string<wchar_t>, to będzie to basic_string<_Elem>, a tymczasem robi się z tego basic_string<_Elem,_Traits,_Ax>. Jak w takim razie zadeklarować zmienną (lub rzutować?) by była basic_string<_Elem>?

Niech i będzie pętla, wpakuję to w funkcję i dodam do reszty konwertujących - w tym projekcie co i rusz jest wstringToString, charToWchar, wcharToChar i wszelkie inne możliwe przerzucanie się w te i nazad.

0

Napisałem o pętli, ale obierając teraz ziemniaki uświadomiłem sobie, że co ja gadam. Pętla tu nic nie da, pomyślałem o czym innym ;p A ten DOMString przyjmuje tylko basic_string<>? Spróbuj na wstring przekonwertować, bo wstring niby jest pochodny basic_string<>.

0

Niestety, jedyne co to dało to Cannot convert from 'std::wstring' to 'std::basic_string<_Elem>'
Pierwszy podany tu kod działał pod VS2003. Po konwersji na VS2008 zaczęła się batalia ;)

Ale, dobrze mi podpowiedziałeś z podejrzeniem definicji DOMString (o czym oczywiście nie pomyślałam wcześniej). Okazało się, że:
typedef std :: basic_string< unsigned short > DOMString;

Wygląda na to, że działa ze zwykłym rzutowaniem na usigned short:
ati_dom::DOMString w = (unsigned short *)wpom;

0

basic_string< unsigned short > - heh, dziwne, jakby nie mogło być char?

Jak działa to dobrze, ale raczej rzutowanie przy łańcucach nie jest wskazane.

0

heh, dziwne, jakby nie mogło być char?

No tak, bo przecież unsigned short to to samo co char.

Ten kod z rzutowaniem działa, bo najzwyczajniej w świecie wywoływany jest konwertujący konstruktor basic_string, który przyjmuje wskaźnik do typu podanego w szablonie. Uważaj tylko, bo o ile na Windowsach wchar_t jest tego samego rozmiaru co unsigned short to nie jest tak wszędzie.

0

basic_string< unsigned short > - heh, dziwne, jakby nie mogło być char?

Chodzi chyba o dwubajtowe znaki, czyli powinno być basic_string<wchar_t> czyli po prostu wstring.
Ale może ten dziwny typ powstał zanim wymyślono typ wchar_t.

Prawdopodobnie zadziałałoby nawet chamskie rzutowanie z DOMString na wstring (jeśli trzeba to i reinterpret_cast).

0

The width of wchar_t is compiler-specific and can be as small as 8 bits.

Taak, taak. Ale program jest pod windowsa, a pod windowsem jest jasno ustalone, że wchar_t ma 16 bitów i przechowuje jeden „code point” kodowania UTF-16.
Pewne założenia dotyczące konkretnej platformy trzeba przyjąć.

Poza tym śmiem wątpić w poczytalność „standaryzatorów” gdy wprowadzali wchar_t jako kolejny niejasny, niesprecyzowany typ.

0

Możliwe, że ten basic_string<unsigned short="short"> został stworzony ze względu na przenośność. Cechy charakterystyczne znaków dla unsigned short zostały skonkretyzowane w <iosfwd>. Oprócz nich są jeszcze konkretyzacje dla char i wchar_t. Z jakiegoś powodu musieli dołączyć jeszcze ten trzeci typ.

0

Jest jeszcze jedno rozwiązanie, skoro i tak ten kod ma nie być przenośny, ale ma działać: http://msdn.microsoft.com/en-us/library/dh8che7s(v=vs.100).aspx .

0

a tak wracając do samego kodu, to na kiego tam jest mbtowc?

   wchar_t wpom[30];
   wcscpy(wpom, L"olaboga");

albo

   const wchar_t wpom2[30] = L"olaboga";

albo nawet

   const wchar_t wpom3[] = L"olaboga"; // rozmiar 8

albo jeszcze jakoś, ale to zależnie od potrzeb.

a najlepiej to zrobić funkcję która jako parametr przyjmuje const wchar_t* a zwraca gotowego DOMString-a.

Współczujemy aurel że musi się męczyć z takim kodem ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1