Мне нужен кроссплатформенный код, чтобы пропустить начальные пробелы для широкой строки.
Похоже, что g ++ (и, очевидно, Qt) вообще не инициализирует слоты для широкой строки
Таким образом, следующий код прекрасно работает для VC ++, но почти g ++ не работает с исключением bad_cast:
#include <string>
#include <locale>
#include <iostream>
int main()
{
typedef std::ctype<std::wstring::value_type> vtct;
std::wstring str=L" 1122";
const std::wstring::value_type* unspace =
std::use_facet<vtct>( std::locale::classic() ).
scan_not(std::ctype_base::space|std::ctype_base::punct,
str.c_str(), str.c_str() + str.length());
//std::cout << unspace << std::endl;
wprintf(L"{%s}\n", unspace);
return 0;
}
Согласно спецификации: "исключение bad_cast, когда хранилище фасетов в объекте локали не содержит фасет с запрошенным языковым стандартом :: id"
Итак, общий вопрос, как g ++ работает с широкой строкой? Более узкий вопрос - как инициализировать грани хотя бы для ctype?
Обновление : после некоторых экспериментов я обнаружил, что linux g ++ правильно инициализирует фасет для широкой строки - поэтому код работает. Очевидно, описанная проблема является особенностью, только если mingw.