Конвертировать wstringstream в LPCWSTR
Я новичок в Winapi и пытаюсь преобразовать wstringstream в LPCWSTR следующим образом (внутри WM_PAINT):
wstringstream ws;
ws << "my text" << endl;
LPCWSTR myWindowOutput = ws.str().c_str();
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 150, 305, myWindowOutput, 10);
Это только производит мусор, может ли кто-нибудь помочь? Спасибо.
1 ответ
LPCWSTR myWindowOutput = ws.str().c_str()
создает временное значение (возвращаемое значение вызова str()), которое исчезает, как только завершается полный оператор. Так как вам нужен временный, вам нужно перенести его на вызов, который в конечном итоге потребляет его:
TextOutW(hdc, 150, 305, ws.str().c_str(), static_cast<int>(ws.str().length()));
Опять же, временные жизни, пока не закончится полное утверждение. На этот раз этого достаточно, чтобы API-вызов использовал его.
В качестве альтернативы, вы можете связать возвращаемое значение str()
к константной ссылке 1), и используйте это вместо этого. Это может быть более подходящим, так как вам нужно использовать возвращаемое значение дважды (чтобы получить указатель на буфер и определить его размер):
wstringstream ws;
ws << "my text" << endl;
hdc = BeginPaint(hWnd, &ps);
const wstring& s = ws.str();
TextOutW(hdc, 150, 305, s.c_str(), static_cast<int>(s.length()));
1) Почему эта работа объяснена в разделе № 88: Кандидат на получение "Наиболее важного констант".